我想要一个快速的方法来执行以下操作,无论是在本机Matlab,C ++中,还是使用工具箱/库,无论哪种方法都能提供最快的解决方案。
让M
成为D维的张量:n1 x n2 x... x nD
,让v1
,v2
,...,vD
为{{1} }尺寸分别为D
,n1
,...,n2
的矢量。
nD
(1< = i< = D)。结果是(D-1)维的多维数组。M*vi
与所有向量的乘积,M
除外。例如,D = 3:
vi
和M
的乘积是2维的张量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
)
另一个问题:上述问题,但是对于稀疏张量。
下面给出了Matlab代码的一个例子。
非常感谢您的帮助!!
v[i1] = Sum_over_i2 of (Sum_over_i3 of M[i1][i2][i3]*v2[i2]*v3[i3]
答案 0 :(得分:2)
我注意到你正在描述的操作采用M
的(D-1)维切片,然后通过vi
的相应条目对它们进行缩放,随后将结果与vi
的索引相加。 {1}}。此代码似乎适用于在您的示例中获取N
:
N2 = squeeze(sum(M.*(v2)', 2));
要在代码中获取v
,您需要做的就是将N
乘以v3
:
v2 = N2*v3;
修改强>
在较旧版本的MatLab中,元素操作符.*
并不像我上面使用它那样工作。另一种选择是bsxfun
:
N2 = squeeze(sum(bsxfun(@times, M, v2'), 2));
刚检查:就性能而言,bsxfun
方式似乎与大型数组的.*
方式一样快,至少在R2016b上如此。