例如:
B1 = 1*A1 + 2*A2;
B2 = 3*A1 + 4*A2;
Run Code Online (Sandbox Code Playgroud)
B1,B2,A1,A2均为2乘2矩阵.
如何有效地定义B的矩阵?通过做类似的事情:
[B1;B2] = [1 2;3 4]*[A1;A2]
Run Code Online (Sandbox Code Playgroud)
它失败.我想做这样的事情,因为我的任务不仅仅是定义两个矩阵,所以我可以手动输入.
使用的实现 matrix-multiplication
我们假设有一个存储缩放参数的2D数组scale.所以,对于我们的情况,我们会 -
scale = [1 2;3 4];
Run Code Online (Sandbox Code Playgroud)
首先,让我们将其叠加A-matrices为3D阵列 -
A = cat(3,A1,A2); % Add more matrices here
Run Code Online (Sandbox Code Playgroud)
最后,计算本身可以在重构为矩阵乘法之后再进行一次2D整形后实现为矩阵乘法,以便将那些B-matrices堆叠成3D阵列 -
B = reshape(reshape(A,4,[])*scale.',2,2,[])
Run Code Online (Sandbox Code Playgroud)
我会使用类似于TroyHaskin的方法,但使用kron:
A1 = 1i*ones(2); % Using imaginary numbers so the result is easier to verify visually.
A2 = magic(2); % [1,3; 4,2]
C = [1 2; 3 4];
B = sum(cat(3,kron(C(:,1),A1),kron(C(:,2),A2)),3);
B =
2.0000 + 1.0000i 6.0000 + 1.0000i
8.0000 + 1.0000i 4.0000 + 1.0000i
4.0000 + 3.0000i 12.0000 + 3.0000i
16.0000 + 3.0000i 8.0000 + 3.0000i
Run Code Online (Sandbox Code Playgroud)
将得到的B数组包含B1和B2"垂直堆叠的"(沿着1种即第一尺寸),使得B1 = B(1:2,:); B2 = B(3:4,:);.
正如Divakar建议的那样,可以使用以下方法将其重新整形为3d数组:
B_3D = permute(reshape(B,2,2,[]),[1,3,2]);
% ... or straight away using:
B_3D = permute(reshape(sum(cat(3,kron(C(:,1),A1),kron(C(:,2),A2)),3),2,2,[]),[1,3,2]);
Run Code Online (Sandbox Code Playgroud)
如果您发现更容易使用单元格,B可以使用以下方法将其转换为矩阵的Nx1单元格数组2x2:
B_C = mat2cell(B,2*ones(size(B,1)/2,1),2);
Run Code Online (Sandbox Code Playgroud)
验证:
isequal(B_C{1}, 1*A1 + 2*A2)
ans =
1
isequal(B_C{2}, 3*A1 + 4*A2)
ans =
1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |