多维数组(或张量)和向量

时间:2016-10-28 14:01:19

标签: c++ arrays matlab multidimensional-array

我想要一个快速的方法来执行以下操作,无论是在本机Matlab,C ++中,还是使用工具箱/库,无论哪种方法都能提供最快的解决方案。

M成为D维的张量:n1 x n2 x... x nD,让v1v2,...,vD为{{1} }尺寸分别为Dn1,...,n2的矢量。

  1. 计算产品nD(1< = i< = D)。结果是(D-1)维的多维数组。
  2. 计算M*vi与所有向量的乘积,M除外。
  3. 例如,D = 3:

    • viM的乘积是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]

1 个答案:

答案 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上如此。