2016-07-28 110 views
2

我希望以兩種方式擴展矩陣,但我無法弄清楚它的代碼; 我不尋找確切的代碼,但只是一個指向哪裏看文學。 以下問題涉及量子力學中換向器方程的線性化,我從物理學的角度瞭解理論,但我不知道在編程世界中我的問題的名稱。將矩陣擴展爲塊矩陣 - 索引問題

我有矩陣A是NxN矩陣,對於這個例子,讓N = 3;所以A是:

A=[a11 a12 a13 
    a21 a22 a23 
    a31 a32 a33] 

我想做一個矩陣B是N^2xN^2大小。 B具有方框形式:

B=[A11 A12 A13 
    A21 A22 A23 
    A31 A32 A33] 

A11=[a11 0 0 
    0 a11 0 ... 
    0 0 a11] 

在B中的每個塊元件是NxN矩陣和每個塊是由屬性A11 = A11 *眼(3,3),等等(所以(B(I,J)連接的= A(I,J)*眼(3,3)))。

我的問題是,我不知道如何構建這樣一個循環,從A的每個元素的溫度3×3矩陣很容易,但我不知道如何在B堆棧這些塊(如何索引位置在B中)。

另一個矩陣我想形式也可爲N^2×N個^ 2矩陣簡單得多:

C=[A 0 0 
    0 A 0 
    0 0 A] 

它是塊對角矩陣做出來A.我想我能設法找到代碼這個(matlab中有blkdiag函數)。

我想在C++和matlab中尋求解決方案。 問題是如何將塊堆棧成N^2xN^2矩陣以及我需要使用多少個循環。 我想要最好的計算方法。

我的想法是做這樣的事情:

for i=1:N 
    for j=1:N 
     for k=1:N 
      B(i*N+j-N,j+k*N-N)=A(i,k); 
      C(i*N+j-N,k+i*N-N)=A(k,j); 
     end 
    end 
end 

這工作完全(????在C++中這將是不-N在B(,)和C(,)分度)),但有可能用2 for循環做到這一點?

回答

2

我建議使用「克羅內克」產品,也稱爲「張量產品」。 matlab函數已經可用「kron」。您只需建立了矩陣:

A=[a11 a12 a13; 
    a21 a22 a23; 
    a31 a32 a33] ; 

然後做KRON產品

B = kron(A,eye(3)); 

因此,「B」是你所尋求的結果,並沒有需要任何循環。

對於「C」的值,你只需要切換「KRON」功能的2個輸入

C = kron(eye(3), A); 
+1

這是驚人的,非常非常感謝,在理論複習有克羅內克的提但我真的不明白這是什麼意思(這篇論文只是給出了公式,沒有太多的解釋)。 我假設在C++中存在類似的函數(我必須在C++中執行此操作),我將在明天查看庫。 非常感謝。 –

+0

克羅內克產品是線性代數中非常強大的工具。我敢打賭,有許多庫內置了克羅內克函數。 – DomDev

+0

@AleksandarDemić這篇文章可能是有趣的:http://stackoverflow.com/questions/4938887/efficient-computation-of-kronecker-products-in-c – rayryeng