[英]passing several boost multi_array from function
我有一堆在函数中使用boost :: multi_array生成的3d数组。 我不想在我的另一个代码中使用所有这些数组,有没有办法做到这一点?
当我有一个二维案件时,我所做的是
typedef boost::numeric::ublas::matrix<double> fils;
boost::array<fils,5> filter1(unsigned width, unsigned height)
{
matrix<double>l,m,n,o,p;
//perform other steps//
boost::array<fils,5> t={l,m,n,o,p};
return t;
}
main.cpp
int main()
{
boost::array<fils,5> z;
z= t(w,h);
}
对于2d情况,此方法效果很好。 我现在想对3D情况做同样的事情
typedef boost::multi_array<double,3>x;
boost::array<x,12>x1(unsigned w,unsigned h,unsigned s)
{
typedef boost::multi_array<double,3>M;
typedef M::index Mi;
m l(boost::extents[w][h][s]),m(boost::extents[w][h][s]),n(boost::extents[w][h][s]),o(boost::extents[w][h][s]);
//perform steps//
}
如何获得矩阵l,m,n,o,p,以便可以将它们用作其他代码段中的源。
在我看来,最优雅的解决方案是像这样声明一个4-D multi_array
:
typedef boost::multi_array<double,4> FloatArray4D;
typedef M::index Mi;
function create4dArray()
{
FloatArray4D returnValue(boost::extents[w][h][s][4]);
// Populate the array as you please here is an example.
for (int i = 0; i < 4; i++) {
for (int j = 0; j < w; j++) {
for (int k = 0; k < h; k++) {
for (int x = 0; x < s; x++) {
returnValue[j][k][x][i] = i+j*10+k*100+x*1000;
}
}
}
}
return returnValue;
}
然后,您可以通过索引最后一个坐标来访问子数组。 通过第一个坐标对它们进行索引可能更有效(就数据的本地化而言),但我不知道boost :: multi_array的实现细节(有人可以在注释中加重吗?)
要从创建的4-D multi_array
提取3-D数据的视图(无副本),可以使用以下命令:
typedef boost::multi_array_types::index_range range;
FloatArray4D::index_gen indices;
FloatArray4D my4DArray = create4dArray();
// Create a new view with 3 dimentions (corresponding to your l) fixing the 4th dimention to 0
FloatArray4D::array_view<3>::type l = [indices[range()][range()][range()][0];
那么您就可以像使用3D数组一样使用l。
PS:切勿给x
或M
命名,尤其不要命名。 是的,长名称很难键入,但是要获得一个具有自动补全功能的体面的文本编辑器,这将不是问题。 但是,知道一个对象的名称将永远是一件很棒的事。 它为您和其他必须阅读您的代码的人提高了可读性。
也不要在函数内部使用typedef。 如果要定义自定义类型,请在共享的头文件中进行定义。 您不需要在任何地方都声明该类型。 实际上,不要过度使用typedef,只有在提高可读性的情况下才使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.