gpt4 book ai didi

c++ - 将矩阵扩展为 block 矩阵 - 索引问题

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:19 26 4
gpt4 key购买 nike

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

我有矩阵 A,它是 NxN 矩阵,对于这个例子,令 N=3;所以 A 是:

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

我想制作一个 N^2xN^2 大小的矩阵 B。 B 具有 block 形式:

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

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

B 中的每个 block 元素都是 NxN 矩阵,每个 block 都通过属性 A11=a11*eye(3,3) 链接,依此类推(所以 (B(I,J)=A(i,j)*eye (3,3))).

我的问题是我不知道如何构造这样一个循环,从 A 中的每个元素制作临时 3x3 矩阵很容易,但我不知道如何在 B 中堆叠这些 block (如何索引B 中的位置).

我想形成的另一个矩阵也是 N^2xN^2 矩阵,它更简单:

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

它是由 A 组成的分块对角矩阵。我想我可以设法为此找到代码(matlab 中有 blkdiag 函数)。

我想要用 C++ 和 matlab 解决的想法。问题是如何将 block 堆叠到 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 循环来实现?

最佳答案

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

关于c++ - 将矩阵扩展为 block 矩阵 - 索引问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38648510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com