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

相关问题