多维数组(或张量)和向量的乘积
Product of a multi-dimensional array (or tensor) and vectors
我想问一种快速的方式来执行以下操作,无论是在本机 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
和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
我注意到您描述的操作需要 (D - 1( M
的维度切片,并通过相应的条目对其进行缩放vi
随后对结果求和 vi
的索引。这段代码似乎适用于在您的示例中获取N
:
N2 = squeeze(sum(M.*(v2)', 2));
要在代码中获取v
,您需要做的就是将N
乘以v3
:
v2 = N2*v3;
编辑
在旧版本的 MatLab 上,元素运算符.*
无法像我上面使用的那样工作。一种选择是bsxfun
:
N2 = squeeze(sum(bsxfun(@times, M, v2'), 2));
刚刚检查:就性能而言,至少在R2016b上,bsxfun
方法似乎与大型阵列的.*
方法一样快。
相关文章:
- 使用Pybind11向Python公开Eigen::张量
- C++中的张量流对象检测
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- PyTorch C++将数据转换为张量失败
- 如何使用 c++ 更改张量流中的per_process_gpu_memory_fraction?
- 编译 GPU 的张量流示例自定义操作
- 在 Torch C++ API 中,如何快速写入张量的内部数据?
- 如何在C++中将一个特征张量乘以另一个特征张量的标量和?
- C++ ABI 兼容性问题/张量流
- 如何从内存缓冲区加载张量流图
- PyTorch C++ 前端向前返回多个张量
- 从 std::向量值创建张量<Tensor>
- 张量流错误 此文件需要编译器和库支持 ISO C++ 2011 标准
- 如何将自定义特征张量类存储到 std::vector 中?
- CUDA 高效的 nd-array(张量)切片
- 部署在张量流中训练的神经网络来火炬C++的最佳方法是什么?
- 将张量的"lower diagonal"映射到矩阵,作为将矩阵的下三角形部分提取到向量的推广
- 在张量流C++中将浮点数的向量传递给张量
- 我应该如何从特征 3 中的张量切片中获取向量
- 多维数组(或张量)和向量的乘积