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