在将一些 MATLAB 代码转换为 C++ 的过程中,我试图以boost::multi_array
各种方式操作 a 的内容。维度的数量可以保持不变,但维度的大小在第二次操作中会发生变化(沿维度求和)。我已经检查了几个参考资料(例如 这些) , 但它们专注于打印输出而不是改变值,所以我想不出一个完成这项工作的好方法。在所有情况下,应将原始文件替换为操纵的.multi_array
multi_array
对于以下两种操作,我尝试了多种方法。我可以使用 4 深的嵌套循环强制它工作,但它的速度非常慢,而且看起来也很痛苦。似乎使用某种方式boost::multi_array<double, 4>::array_view<3>::type
来获取我想要操作的维度应该可以工作,但是编译器不接受我尝试对 array_view 的元素执行的任何操作。
那么在 C++ 中快速执行这些操作的最佳方法是什么?
操作 #1:沿维度乘以向量
%MATLAB method
%A is a [mxnxpxq] matrix, v is a [1xp] vector
%Reshape v into a [1x1xpx1] matrix and perform elementwise multiplication
A = bsxfun(@times,A,reshape(v,1,1,[],1));
%A(:,:,1,:) has been multiplied by v(1), A(:,:,2,:) has been multiplied by v(2), etc
//C++ pseudocode -- void return type, A passed in by reference
for (int i=0;i<length of dimension 3;++i)
{
Aview = array_view of A[[range()][range()][i][range()]];
Aview = Aview * v(i); //Not sure the best way to do this, either -- loop through elements?
}
//Does manipulation of Aview alter A?
return;
操作#2:沿一个维度对矩阵求和
%MATLAB method
A = sum(A,3);
%A was [mxnxpxq] and now is [mxnx1xq]
//C++ pseudocode -- void return type, A passed in by reference
Aview0 = array_view of A[[range()][range()][0][range()]];
for (int i=1;i<length of dimension 3;++i)
{
Aview = array_view of A[[range()][range()][i][range()]];
Aview0 = Aview0 + Aview; //Again not sure the best way to do this
}
A = Aview0;
return;