【问题标题】:3d matrix by column vector multiplication通过列向量乘法的 3d 矩阵
【发布时间】:2012-10-11 13:26:20
【问题描述】:

我有一个 3d(或通常是 n 维)矩阵 A 的维度

size(A) = [d1 d2 d3 ... dn]. 

现在我想在其中一个维度上与列向量v 进行向量乘法(就像我在二维中做的那样,我得到一个向量返回 - 例如d1 = 2d3 = 4size(v) = d2),这样

(A*d)_i = sum(a_ij*v_j). 

因此我想减少一维。

是否有一个 Matlab 函数(循环除外)返回 d3 维列向量 v

(A*v)_ij = sum(A_ijk*v_k). 

我希望这很清楚。

谢谢!

【问题讨论】:

    标签: matlab multiplication


    【解决方案1】:

    您可以通过几个reshape 来做到这一点:

    A=rand(2,3,4);
    v=rand(1,4);
    reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)])
    

    基本上,您将 A 重塑为二维矩阵 A2((ij),(k))=A((i),(j),(k)):

    A2=reshape(A,[size(A,1)*size(A,2),size(A,3)])
    

    然后你做通常的乘法:

    对于所有 (ij) B2((ij))=sum_k A2((ij),(k))*v((k)):

    B2=A2*v
    

    你重塑回来:

    B((i),(j))=B((ij))

    B=reshape(B2,[size(A,1) size(A,2)])
    

    我希望这很清楚

    【讨论】:

    • 好的 - 非常感谢。我希望有更流畅的东西,但我想这已经足够公平了。
    • 这种方法只在要相乘的维度是N-d矩阵的最后一个维度时才有效。如果代码适用于 N-D 矩阵的任何维度 1...N,那就太好了。似乎可以在开头和结尾使用dimshift
    • permute 似乎确实可行.... 考虑一下需要几分钟。随意编辑我的答案,或添加您自己的答案。我马上就要截止日期了。
    • @cjh 请发布您的示例作为答案;它可能对许多人有用。
    【解决方案2】:

    你可以做得更流畅一些。对于矩阵 reshape 只需要 1 个参数,如果没有指定另一个参数会自动计算出来,这在这种情况下非常有用。

    所以,Oli 提出的解决方案可以更简单地写成

    A = rand(2,3,4);
    v = rand(4,1);
    
    A2 = reshape(A, [], numel(v));      % flatten first two dimensions
    B2 = A2*v;
    B  = reshape(B2, size(A, 1), []);
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2016-06-03
      • 1970-01-01
      • 2020-03-16
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多