【问题标题】:Multiply columns of a matrix with 2d matrix slices of a 3d matrix in MatLab在 MatLab 中将矩阵的列与 3d 矩阵的 2d 矩阵切片相乘
【发布时间】:2012-01-31 16:15:33
【问题描述】:

基本上,我想执行以下计算:

    G is m x n x k
    S is n x k

    Answer=zeros(m,d)
    for Index=1:k
        Answer(:,Index)=G(:,:,Index)*S(:,Index)
    end

所以,答案是一个矩阵,其列是 3d 矩阵的每一层与另一个矩阵的列相乘的结果。

这看起来确实是一种简单的操作,我希望找出在 Matlab 中是否有本地或矢量化(或至少 >> 更快)的方式来执行这种类型的计算。 谢谢。

【问题讨论】:

    标签: matlab vectorization matrix-multiplication


    【解决方案1】:

    尝试使用mtimesx from the Matlab File Exchange。这是迄今为止我发现的进行这种 n 维数组乘法的最佳(快速/高效)工具,因为它使用 mex 。我认为你也可以使用bsxfun,但是我的 Matlab-fu 不足以处理这种事情。

    您有m x n x k 和m x k 并且想要生成n x k。

    mtimesx 将i x j x k 和j x r x k 等输入相乘以生成i x r x k。

    要将您的问题以mtimesx 形式表达,请将G 设为m x n x k,并将S 扩展为n x 1 x k。然后mtimesx(G,S) 将是m x 1 x k,然后可以将其展平为m x k。

    m=3; 
    n=4; 
    k=2;
    G=rand(m,n,k);
    S=rand(n,k);
    
    % reshape S
    S2=reshape(S,n,1,k);
    
    % do multiplication and flatten mx1xk to mxk
    Ans_mtimesx = reshape(mtimesx(G,S2),m,k)
    
    % try loop method to compare
    Answer=zeros(m,k);
    for Index=1:k
        Answer(:,Index)=G(:,:,Index)*S(:,Index);
    end
    
    % compare
    norm(Ans_mtimesx-Answer)
    % returns 0.
    

    因此,如果您想要单线,您可以这样做:

    Ans = reshape(mtimesx(G,reshape(S,n,1,k)),m,k)
    

    顺便说一句,如果您在Matlab Newsreader forums 上发布您的问题,将会有很多大师竞相为您提供比我更优雅或更高效的答案!

    【讨论】:

    【解决方案2】:

    这是 bsxfun() 版本。如果 A 是 m×n 矩阵且 x 是 n×1 向量 那么 A*x 可以计算为

    sum(bsxfun(@times, A, x'), 2)
    

    操作 permute(S, [3 1 2]) 将获取 S 的列并将它们沿第三维作为行分布。 [3 1 2] 是 S 的维数的排列。

    因此 sum(bsxfun(@times, G, permute(S, [3 1 2])), 2) 得到了答案,但是 将结果留在第三维。为了得到你想要的形式 需要另一个置换。

    permute(sum(bsxfun(@times, G, permute(S, [3 1 2])), 2), [1 3 2])
    

    【讨论】:

      【解决方案3】:

      您可以做的一件事是将您的 3d 矩阵表示为 2d 块对角矩阵,每一层都是一个对角块。在这种情况下,二维矩阵应表示为包含堆叠列的向量。如果矩阵很大,则将其声明为稀疏矩阵。

      【讨论】:

      • 这行得通,但我并不完全相信它会有助于提高速度。我稍后会试试看。
      猜你喜欢
      • 2018-07-09
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多