

Pythonのnumpy.einsumで実現できる，次のような要素ごとの行列積操作をMATLABで実現したいです．

[code]

    import numpy as np
    a = np.array([[[1,2],[3,4]],[[1,3],[-3,1]]])
    b = np.array([[2,-1],[1,1]])
    c = np.einsum('ijk,kl->ijl',a,b)
    d1 = a[0]@b
    d2 = a[1]@b
    print(c)
    print(d1)
    print(d2)
    
[/code]

すなわち，3次元配列A (サイズ：MxMxN)，2次元配列B（サイズ：MxM）に対し，  
各n=1,...,Nに対して C[:,:,n] = A[:,:,n] * B を満たす3次元配列CをMATLABで効率よく計算したいです．  
現状はnに関してループを回している状況なので，より効率のよい方法があればお教えください．  
「GithubやMathWorksのFile ExchangeにあるeinsumのMATLAB実装を用いる」という方法以外でよろしくお願いいたします．


CC BY-SA 4.0
2019-04-29T11:32:14.680
54569
2019-05-30T07:20:48.713
2019-04-29T11:48:39.210
32189
32189
question
python numpy matlab
MATLABで多次元配列の要素ごとの行列積


3次元配列A
(サイズ：MxMxN)，2次元配列B（サイズ：MxM）があった場合、AをM*NxMの形に変えてから普通の行列の積を取ればよいのではないでしょうか？

[code]

    a =  [1, 2; 3, 4]; 
    a(:,:,2) = [1, 3; -3 1];
    b =  [2, -1; 1, 1];
    
    M = size(a,1);
    N = size(a,3);
    a2 = permute(a, [1, 3, 2]);
    A = reshape(a2, M*N,M);
    % A =
    %      1     2
    %      3     4
    %      1     3
    %     -3     1
    
    C = A*b;
    
    tC = C';
    c0 = reshape(tC, M, M, N);
    c = permute(c0, [2,1,3])
    
[/code]


CC BY-SA 4.0
2019-05-30T07:20:48.713
55367
2019-05-30T07:20:48.713
34500
54569
answer