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
非常感謝提前。
說我有以下矩陣乘以矩陣中的每一行由另一個矩陣
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
非常感謝提前。
您可以使用:
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
使得列數B與A中的列數相符。在bsxfun()
之後的每個行中的元素方式相加(記住,permute
將行移位到第二維),再現向量 - 矩陣相乘的效果。 for
循環。
繼第一個sum
之後,第二維是單一維。因此,我們使用第二個permute
將第二維移動到第三維並生成二維矩陣。現在,c1和B是相同的大小。以下在第二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);
當談到矩陣乘法MATLAB /操作,操作的順序可以是一個巨大的痛苦。這種方法有一些隱藏的美,因爲元素乘法不需要你跟蹤訂單。只要確保你在'bsxfun()'調用中有正確的矩陣,你就很好去!很好的回答 –
@VladislavMartin謝謝!也用於廣泛的編輯 –