2

假設我有一個向量B = [1; 2; 3]。然後如何乘以一個向量3次得到3維矩陣

B*B' = [1*1 1*2 1*3 ; 2*1 2*2 2*3 ; 3*1 3*2 3*3] 

現在,我需要與B再乘以新的矩陣B*B',爲了得到以下3維矩陣C

C(:,:,1) = [1*1*1 1*2*1 1*3*1 ; 2*1*1 2*2*1 2*3*1 ; 3*1*1 3*2*1 3*3*1] 

C(:,:,2) = [1*1*2 1*2*2 1*3*2 ; 2*1*2 2*2*2 2*3*2 ; 3*1*2 3*2*2 3*3*2] 

C(:,:,3) = [1*1*3 1*2*3 1*3*3 ; 2*1*3 2*2*3 2*3*3 ; 3*1*3 3*2*3 3*3*3] 

任何想法,我該怎麼辦呢?

(我原來的載體是長,所以我不能手動做到這一點..)

回答

4

R2016b之前:

C = bsxfun(@times, permute(B, [3 2 1]), B*B'); 

後R2016b:

C = permute(B, [3 2 1]) .* (B*B'); 
+0

@zeeMonkeez謝謝,編輯 –

3

您可以使用bsxfun執行這些操作。

out = bsxfun(@times, bsxfun(@times, B, B.'), reshape(B, 1, 1, [])); 

或者,如果您想讓它更清晰易讀,可以將其分解爲兩個操作。首先執行第一次乘法。

​​

然後通過B再乘以這個(但我們重塑B1 x 1 x 3使結果的3D矩陣)

out = bsxfun(@times, reshape(B, 1, 1, [])); 

如果你在R2016b或更高版本,你可以做的以下。

out = (B .* B.') .* reshape(B, 1, 1, []); 
1

另一種形式是,以第一矩陣乘法的結果重塑成一列,執行第二矩陣乘法,和重塑結果:

C = reshape(B*reshape(B*B.',1,[]),numel(B)*[1 1 1]);