2017-06-14 85 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