我希望以两种方式扩展矩阵,但我无法弄清楚它的代码; 我不寻求确切的代码,而只是寻找文献中的指针。 下面的问题涉及量子力学中换向器方程的线性化,我从物理学的角度了解理论,但我不知道编程世界中我的问题的名称。
我有矩阵A,它是NxN矩阵,对于这个例子,让N = 3;所以A是:
A=[a11 a12 a13
a21 a22 a23
a31 a32 a33]
我希望制作一个N ^ 2xN ^ 2大小的矩阵B. 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 * eye(3,3)链接,依此类推(so(B(I,J)= A(i,j)* eye (3,3)))。
我的问题是我不知道如何构造这样的循环,从A中的每个元素制作临时3x3矩阵很容易,但我不知道如何在B中堆叠这些块(如何索引B中的职位)。
我想形成的另一个矩阵也是N ^ 2xN ^ 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 ++中,在B(?,?)和C(?,?)索引中没有-N),但是有可能用2 for for循环吗?
答案 0 :(得分:2)
我建议使用" Kronecker"产品,也称为"张量产品"。 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);