MATLAB:将新矩阵定义为矩阵的线性组合

Ka-*_*Yip 2 matlab matrix

例如:

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)

它失败.我想做这样的事情,因为我的任务不仅仅是定义两个矩阵,所以我可以手动输入.

Div*_*kar 7

使用的实现 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)


Dev*_*-iL 5

我会使用类似于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数组包含B1B2"垂直堆叠的"(沿着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)