将矩阵的每一行乘以另一个矩阵

时间:2017-01-20 16:22:14

标签: arrays matlab matrix

说我有以下矩阵

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

和另一个矩阵

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

如何将矩阵B的每一行乘以矩阵A(不使用for循环),即

for i = 1:4
    c(i) = B(i,:)*A*B(i,:)'
end
提前多多感谢。

1 个答案:

答案 0 :(得分: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,以便 B 中的列数与 A 中的列数相匹配。在bsxfun()中按元素乘法后,每行总结(记住,permute将行移动到第二维),再现向量矩阵乘法的效果 B(i ,:) * A for循环中发生。

在第一个sum之后,第二维是单身维度。因此,我们使用第二个permute将第二维移动到第三维并生成二维矩阵。现在, c1 B 的大小相同。在第二个bsxfun()中逐个元素乘法后,每列总结(记住,permute将列移回第二维),再现 B(i,:)<的效果/ strong> * A * 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);