我將兩個矩陣乘以一個矢量,使用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