2017-06-14 87 views
1

我将两个矩阵乘以一个矢量,使用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 

回答

3

样品这如何做到这一点:

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循环。而已。

+0

非常感谢。根据这个。我们也可以这样做。 A =兰特(5,5); B = rand(5,5); C = [0.1 0.3]; C1 =重塑(C,[1,1,2]); D1 = A. * B. * C1; – Math

1

你可以做到这一点大部分矩阵索引:

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