Duplication matrix

Wiki上的解釋

Duplication matrix DnDn 是一個線性變換,用於將半線性化矩陣(half-vectorization)轉換爲線性化矩陣(vectorization).

對於一個對稱陣AA而言,我們將其半線性化矩陣表示爲vech(A)vech(A),線性化矩陣表示爲vec(A)vec(A).。
例如,一個2×22 \times 2的對稱矩陣 A=[abbd]A=\left[\begin{array}{ll}a & b \\ b & d\end{array}\right]vech(A)=[abd]vech(A)=\left[\begin{array}{l}a \\ b \\ d\end{array}\right] , vec(A)=[abbd]vec(A)= \left[\begin{array}{l}a \\ b \\ b \\ d\end{array}\right],則
Dnvech(A)=vec(A)D_{n} \operatorname{vech}(A)=\operatorname{vec}(A)

[100010010001][abd]=[abbd]\left[\begin{array}{lll}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}a \\ b \\ d\end{array}\right]=\left[\begin{array}{l}a \\ b \\ b \\ d\end{array}\right]

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章