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

Posted

技术标签:

【中文标题】将矩阵扩展为块矩阵 - 索引问题【英文标题】:Expanding matrix into block matrix - indexing issue 【发布时间】:2016-07-28 23:57:29 【问题描述】:

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

我有一个矩阵 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 循环来做到这一点?

【问题讨论】:

【参考方案1】:

我建议使用“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);

【讨论】:

这太棒了,非常感谢,在理论评论中提到了 Kronecker,但我并没有真正理解它的含义(论文只是给出了公式,没有太多解释)。我假设 C++ 中存在类似的功能(我必须在 C++ 中执行此操作),明天我将查看库。非常感谢。 Kronecker 产品是线性代数中一个非常强大的工具。我敢打赌,有很多内置 kronecker 函数的库。 @AleksandarDemić 可能对这篇文章感兴趣:***.com/questions/4938887/…

以上是关于将矩阵扩展为块矩阵 - 索引问题的主要内容,如果未能解决你的问题,请参考以下文章

将文本片段扩展为更长的文本块

显示大型数据表

在 amazon-braket 上的大型矩阵上应用 QPE

用矩阵来运算向量与点的平移

将 _In_ 扩展为 const

Groovy 将元组/映射扩展为参数