将矩阵扩展为块矩阵 - 索引问题

时间:2016-07-28 23:57:29

标签: c++ algorithm matlab matrix linear-algebra

我希望以两种方式扩展矩阵,但我无法弄清楚它的代码; 我不寻求确切的代码,而只是寻找文献中的指针。 下面的问题涉及量子力学中换向器方程的线性化,我从物理学的角度了解理论,但我不知道编程世界中我的问题的名称。

我有矩阵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循环吗?

1 个答案:

答案 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);