我将两个矩阵乘以一个矢量,使用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
我将两个矩阵乘以一个矢量,使用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]))
说明:关键是要改变C
从行向量(例如x方向),以第三维(或z方向)使用permute
,这就好像您将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
非常感谢。根据这个。我们也可以这样做。 A =兰特(5,5); B = rand(5,5); C = [0.1 0.3]; C1 =重塑(C,[1,1,2]); D1 = A. * B. * C1; – Math