Wiki上的解释
Duplication matrix 是一个线性变换,用于将半线性化矩阵(half-vectorization)转换为线性化矩阵(vectorization).
对于一个对称阵而言,我们将其半线性化矩阵表示为,线性化矩阵表示为.。
例如,一个的对称矩阵 , , ,则
Matlab实现
// An highlighted block
n=2; %%%%n阶可设置
tic
m = n * (n + 1) / 2;
nsq = n^2;
r = 1;
a = 1;
v = zeros(1, nsq);
for i = 1:n
v(r:r + i - 2) = i - n + cumsum(n - (0:i-2));
r = r + i - 1;
v(r:r + n - i) = a:a + n - i;
r = r + n - i + 1;
a = a + n - i + 1;
end
D2 = sparse(1:nsq, v, 1, nsq, m);
toc
第二
tic
m = n * (n + 1) / 2;
nsq = n^2;
D = spalloc(nsq, m, nsq);
row = 1;
a = 1;
for i = 1:n
b = i;
for j = 0:i-2
D(row + j, b) = 1;
b = b + n - j - 1;
end
row = row + i - 1;
for j = 0:n-i
D(row + j, a + j) = 1;
end
row = row + n - i + 1;
a = a + n - i + 1;
end
toc
第三
tic
m = n * (n + 1) / 2;
nsq = n^2;
r = 1;
a = 1;
v = zeros(1, nsq);
for i = 1:n
b = i;
for j = 0:i-2
v(r) = b;
b = b + n - j - 1;
r = r + 1;
end
for j = 0:n-i
v(r) = a + j;
r = r + 1;
end
r = r + n - i + 1;
a = a + n - i + 1;
end
D2 = sparse(1:nsq, v, 1, nsq, m);
toc
以上代码摘自
https://ww2.mathworks.cn/matlabcentral/answers/473737-efficient-algorithm-for-a-duplication-matrix?s_tid=prof_contriblnk