【问题标题】:Multiply each row of a matrix by another matrix将矩阵的每一行乘以另一个矩阵
【发布时间】:2017-01-20 16:22:14
【问题描述】:

假设我有以下矩阵

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

非常感谢。

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    你可以使用:

    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 将第二维移动到第三维并生成一个二维矩阵。现在,c1B 的大小相同。在第二个bsxfun() 中的元素乘法之后,每列被求和(记住,permute 将列移回第二维),再现 B(i,:) 的效果* 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);
    

    【讨论】:

    • 当谈到 MATLAB 中的矩阵乘法/操作时,操作顺序可能是一个巨大的痛苦。这种方法有一些隐藏的美,因为元素乘法不需要你跟踪顺序。只要确保您在bsxfun() 调用中拥有正确的矩阵,您就可以开始了!很好的答案
    • @VladislavMartin 谢谢!也用于广泛的编辑
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多