Multiply a 3D matrix with a 2D matrix

前端 未结 10 1265
盖世英雄少女心
盖世英雄少女心 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条回答
  •  时光取名叫无心
    2020-11-28 09:53

    I would like to share my answer to the problems of:

    1) making the tensor product of two tensors (of any valence);

    2) making the contraction of two tensors along any dimension.

    Here are my subroutines for the first and second tasks:

    1) tensor product:

    function [C] = tensor(A,B)
       C = squeeze( reshape( repmat(A(:), 1, numel(B)).*B(:).' , [size(A),size(B)] ) );
    end
    

    2) contraction: Here A and B are the tensors to be contracted along the dimesions i and j respectively. The lengths of these dimensions should be equal, of course. There's no check for this (this would obscure the code) but apart from this it works well.

       function [C] = tensorcontraction(A,B, i,j)
          sa = size(A);
          La = length(sa);
          ia = 1:La;
          ia(i) = [];
          ia = [ia i];
    
          sb = size(B);
          Lb = length(sb);
          ib = 1:Lb;
          ib(j) = [];
          ib = [j ib];
    
          % making the i-th dimension the last in A
          A1 = permute(A, ia);
          % making the j-th dimension the first in B
          B1 = permute(B, ib);
    
          % making both A and B 2D-matrices to make use of the
          % matrix multiplication along the second dimension of A
          % and the first dimension of B
          A2 = reshape(A1, [],sa(i));
          B2 = reshape(B1, sb(j),[]);
    
          % here's the implicit implication that sa(i) == sb(j),
          % otherwise - crash
          C2 = A2*B2;
    
          % back to the original shape with the exception
          % of dimensions along which we've just contracted
          sa(i) = [];
          sb(j) = [];
          C = squeeze( reshape( C2, [sa,sb] ) );
       end
    

    Any critics?

提交回复
热议问题