将两个矩阵乘以一个向量
Multiplying two matrices by a vector
我正在使用 loop
将两个矩阵乘以一个向量。是否可以在不使用 loop
的情况下做到这一点?
类似 D1=C.*(A.*B)
的东西不起作用。
代码示例下方
clear;
clc;
A=rand(5,5);
B=rand(5,5);
C=[0.1 0.3];
for ii=1:2
D(:,:,ii)=A.*B.*C(ii);
end
如何操作:
D=bsxfun(@times,A.*B,permute(C,[3 1 2]))
解释:诀窍是使用 permute
将 C
从行向量(比如 x 方向)更改为第 3 维(或 z 方向),就好像你会对 C 的定义不同:
C(:,:,1)=0.1;
C(:,:,2)=0.3;
现在,bsxfun
是执行您编写的 for 循环的一种紧凑方式。而已。
您可以使用矩阵索引来做到这一点:
clear;
clc;
A=rand(5,5);
B=rand(5,5);
C=[0.1 0.3];
% Get matrices to final size
A = A(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
B = B(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
C = C(ones(1,size(A,2)),:,ones(1,size(A,1))); % make it size size(A,2)xlength(C)xsize(A,1)
C = permute(C,[3 1 2]); % change to correct order
D = A.*B.*C;
或者作为一个衬里(更快,需要更少的内存并且不改变输入变量):
D = A(:,:,ones(length(C),1)).*B(:,:,ones(length(C),1)).*permute(C(ones(1,size(A,2)),:,ones(1,size(A,1))),[3 1 2]);
不过,我认为对于大多数矩阵大小,bsxfun
更快(并且可读性更好)。但是用索引解决问题要有趣得多:P
我正在使用 loop
将两个矩阵乘以一个向量。是否可以在不使用 loop
的情况下做到这一点?
类似 D1=C.*(A.*B)
的东西不起作用。
代码示例下方
clear;
clc;
A=rand(5,5);
B=rand(5,5);
C=[0.1 0.3];
for ii=1:2
D(:,:,ii)=A.*B.*C(ii);
end
如何操作:
D=bsxfun(@times,A.*B,permute(C,[3 1 2]))
解释:诀窍是使用 permute
将 C
从行向量(比如 x 方向)更改为第 3 维(或 z 方向),就好像你会对 C 的定义不同:
C(:,:,1)=0.1;
C(:,:,2)=0.3;
现在,bsxfun
是执行您编写的 for 循环的一种紧凑方式。而已。
您可以使用矩阵索引来做到这一点:
clear;
clc;
A=rand(5,5);
B=rand(5,5);
C=[0.1 0.3];
% Get matrices to final size
A = A(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
B = B(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
C = C(ones(1,size(A,2)),:,ones(1,size(A,1))); % make it size size(A,2)xlength(C)xsize(A,1)
C = permute(C,[3 1 2]); % change to correct order
D = A.*B.*C;
或者作为一个衬里(更快,需要更少的内存并且不改变输入变量):
D = A(:,:,ones(length(C),1)).*B(:,:,ones(length(C),1)).*permute(C(ones(1,size(A,2)),:,ones(1,size(A,1))),[3 1 2]);
不过,我认为对于大多数矩阵大小,bsxfun
更快(并且可读性更好)。但是用索引解决问题要有趣得多:P