2016-10-28 7 views
0

ネイティブのMatlab、C++、またはツールボックス/ライブラリを使用して、以下の操作を高速に実行する方法をお聞きしたいと思います。 。多次元配列(またはテンソル)とベクトルの製品

Mは、D次元のテンソルとする:n1 x n2 x... x nD、およびv1v2は、...、vDはその寸法それぞれn1n2、...、nDあるDベクトルとします。

  1. 計算産物M*vi(1 < = I < = D)。結果は(D-1)次元の多次元配列です。
  2. viを除いて、Mのベクトルとすべてのベクトルを計算します。と例えば

、D = 3:Mv1の生成物は、テンソル2次元のN(すなわち、マトリックス)である

N[i2][i3] = Sum_over_i1 of M[i1][i2][i3]*v1[i1]

  • Mとの製品はMv2v3の積がベクトル

v[i1] = Sum_over_i2 of (Sum_over_i3 of M[i1][i2][i3]*v2[i2]*v3[i3]vある

N[i1][i3] = Sum_over_i2 of M[i1][i2][i3]*v2[i2]

  • マトリックスN

    でさらに質問:上記スパーステンソルの場合は

    Matlabコードの例を以下に示します。

    ご協力いただきありがとうございます。 Mの次元スライスし、その後viのインデックスを超える結果を合計viの対応するエントリによってそれらをスケール - (1 D)

    n1 = 3; 
    n2 = 5; 
    n3 = 4; 
    
    M = randn(n1,n2,n3); 
    v1 = randn(n1,1); 
    v2 = randn(n2,1); 
    v3 = randn(n3,1); 
    
    %% N = M*v2 
    N = zeros(n1,n3); 
    for i1=1:n1 
        for i3=1:n3 
         for i2=1:n2 
          N(i1,i3) = N(i1,i3) + M(i1,i2,i3)*v2(i2); 
         end 
        end 
    end 
    
    %% v = M*v2*v3 
    v = zeros(n1,1); 
    for i1=1:n1 
        for i2=1:n2 
         for i3=1:n3 
          v(i1) = v(i1) + M(i1,i2,i3)*v2(i2)*v3(i3); 
         end 
        end 
    end 
    
+0

少なくともN(i1、i3)= M(i1、:、i3)* v2; ' – rst

+0

@RobertStettler:ありがとうございます。最も明白な可能性があります。 – Khue

答えて

2

私は気づいたあなたが記述されている操作がかかります。このコードは、あなたの例ではNを取得するために動作するようです:

N2 = squeeze(sum(M.*(v2)', 2)); 

コード内でvを取得するには、すべてを行う必要が乗算v3によってNです:

v2 = N2*v3; 

EDIT

私は上記のそれを使用していたように動作しません .* MatLabの要素単位演算子の古いバージョンでは

。一つの選択肢は、bsxfun次のとおりです。

N2 = squeeze(sum(bsxfun(@times, M, v2'), 2)); 

はジャストにチェック:パフォーマンスの面では、bsxfun方法は、少なくともR2016bで、早く大きな配列のための.*方法として思えます。

+0

おかげで(存在。そうでなければ私は2つの操作のためにではなく、最初のものだけを求めるません。最初の1をループして適用することなく、第2のタイプの積を計算する方法であるかもしれない)が、あなたをコンパイルするとき、私はこのエラーを得ましたコード: "。* を使用するとエラーが発生します。確認していただけますか? – Khue

+0

異なるバージョンのMatLabを使用している可能性があります。バージョンで私はこのようなコードを使用しています: 'ones(2,3)。* [1; 2]または 'ones(2,3)。* [1,2,3]'は正常に動作しますが、これはR2015のケースではないことを覚えています。これを動作させるには、 'bsxfun'を使う必要があります。これは遅いかもしれません(編集を見てください)。 –

+0

ありがとう、ゆり! – Khue