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谢谢!也用于广泛的编辑 –