Multiply a 3D matrix with a 2D matrix

前端 未结 10 1287
盖世英雄少女心
盖世英雄少女心 2020-11-28 09:29

Suppose I have an AxBxC matrix X and a BxD matrix Y.

Is there a non-loop method by which I can multiply

10条回答
  •  萌比男神i
    2020-11-28 09:47

    To answer the question, and for readability, please see:

    • ndmult, by ajuanpi (Juan Pablo Carbajal), 2013, GNU GPL

    Input

    • 2 arrays
    • dim

    Example

     nT = 100;
     t = 2*pi*linspace (0,1,nT)’;
    
     # 2 experiments measuring 3 signals at nT timestamps
     signals = zeros(nT,3,2);
     signals(:,:,1) = [sin(2*t) cos(2*t) sin(4*t).^2];
     signals(:,:,2) = [sin(2*t+pi/4) cos(2*t+pi/4) sin(4*t+pi/6).^2];
    
     sT(:,:,1) = signals(:,:,1)’;
     sT(:,:,2) = signals(:,:,2)’;
       G = ndmult (signals,sT,[1 2]);
    

    Source

    Original source. I added inline comments.

    function M = ndmult (A,B,dim)
      dA = dim(1);
      dB = dim(2);
    
      # reshape A into 2d
      sA = size (A);
      nA = length (sA);
      perA = [1:(dA-1) (dA+1):(nA-1) nA dA](1:nA);
      Ap = permute (A, perA);
      Ap = reshape (Ap, prod (sA(perA(1:end-1))), sA(perA(end)));
    
      # reshape B into 2d
      sB = size (B);
      nB = length (sB);
      perB = [dB 1:(dB-1) (dB+1):(nB-1) nB](1:nB);
      Bp = permute (B, perB);
      Bp = reshape (Bp, sB(perB(1)), prod (sB(perB(2:end))));
    
      # multiply
      M = Ap * Bp;
    
      # reshape back to original format
      s = [sA(perA(1:end-1)) sB(perB(2:end))];
      M = squeeze (reshape (M, s));
    endfunction
    

提交回复
热议问题