ネイティブのMatlab、C++、またはツールボックス/ライブラリを使用して、以下の操作を高速に実行する方法をお聞きしたいと思います。 。多次元配列(またはテンソル)とベクトルの製品
はM
は、D次元のテンソルとする:n1 x n2 x... x nD
、およびv1
、v2
は、...、vD
はその寸法それぞれn1
、n2
、...、nD
あるD
ベクトルとします。
- 計算産物
M*vi
(1 < = I < = D)。結果は(D-1)次元の多次元配列です。 vi
を除いて、M
のベクトルとすべてのベクトルを計算します。と例えば
、D = 3:M
とv1
の生成物は、テンソル2次元のN
(すなわち、マトリックス)である
N[i2][i3] = Sum_over_i1 of M[i1][i2][i3]*v1[i1]
M
との製品はM
とv2
とv3
の積がベクトル
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
少なくともN(i1、i3)= M(i1、:、i3)* v2; ' – rst
@RobertStettler:ありがとうございます。最も明白な可能性があります。 – Khue