【发布时间】:2017-03-11 10:41:44
【问题描述】:
我想寻求一种快速的方法来执行以下操作,无论是在原生 Matlab、C++ 中,还是使用工具箱/库,都可以提供最快的解决方案。
设M为D维的张量:n1 x n2 x... x nD,设v1,v2,...,vD为D维数分别为n1,@987654328的向量@,..., nD.
- 计算乘积
M*vi(1 - 计算
M与除vi之外的所有向量的乘积。
例如,当 D = 3:
-
M和v1的乘积是一个二维张量N(即矩阵),其中
N[i2][i3] = Sum_over_i1 of M[i1][i2][i3]*v1[i1]
-
M和v2的乘积是矩阵N其中
N[i1][i3] = Sum_over_i2 of M[i1][i2][i3]*v2[i2]
-
M和v2和v3的乘积是一个向量v其中
v[i1] = Sum_over_i2 of (Sum_over_i3 of M[i1][i2][i3]*v2[i2]*v3[i3])
还有一个问题:以上只是针对稀疏张量。
Matlab 代码示例如下。
非常感谢您的帮助!
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;来简化内部for循环 -
@RobertStettler:谢谢,但我想写一个最明显的例子。 (可能有一种方法可以计算第二种类型的乘积,而无需循环并应用第一种。否则我不会要求两次操作,而只要求第一种。)
标签: c++ arrays matlab multidimensional-array