2017-01-20 298 views
2

說我有以下矩陣乘以矩陣中的每一行由另一個矩陣

B = [1 2 3;4 5 6;7 8 9;10 11 12] 

和另一個矩陣

A = [a b c;d e f;g h i] 

如何通過矩陣乘法矩陣B的每一行(不使用for循環),即

for i = 1:4 
    c(i) = B(i,:)*A*B(i,:)' 
end 

非常感謝提前。

回答

4

您可以使用:

c = diag(B*A*B.'); 

然而,這種計算整個4×4矩陣只提取其對角線,所以它不是很有效。

僅計算所需的值

一種更有效的方法是:

c = sum(bsxfun(@times, permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]), B), 2); 

這裏是上面的代碼的擊穿:

c1 = sum(bsxfun(@times, B, permute(A, [3 1 2])), 2); % B(i,:)*A 
c = sum(bsxfun(@times, permute(c1, [1 3 2]), B), 2); % (B(i,:)*A)*B(i,:)' 

被使用的第一permute使得列數BA中的列數相符。在bsxfun()之後的每個行中的元素方式相加(記住,permute將行移位到第二維),再現向量 - 矩陣相乘的效果。 for循環。

繼第一個sum之後,第二維是單一維。因此,我們使用第二個permute將第二維移動到第三維並生成二維矩陣。現在,c1B是相同的大小。以下在第二bsxfun()逐元素乘法每一列總結了(記住,permute移列返回到第二維),再現B(i的效果,:) * * B(I, :)'

注意這種方法的隱藏優勢。由於我們使用逐元素乘法來複制矩陣乘法的結果,所以參數的順序在bsxfun()調用中無關緊要。少一點擔心!

或者,從MATLAB R2016b起,您可以通過.*代替bsxfun(@times,...),感謝implicit expansion

c = sum(permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]).*B, 2); 
+0

當談到矩陣乘法MATLAB /操作,操作的順序可以是一個巨大的痛苦。這種方法有一些隱藏的美,因爲元素乘法不需要你跟蹤訂單。只要確保你在'bsxfun()'調用中有正確的矩陣,你就很好去!很好的回答 –

+1

@VladislavMartin謝謝!也用於廣泛的編輯 –

相關問題