2016-07-28 117 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