繁体   English   中英

从函数传递几个boost multi_array

[英]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:切勿给xM命名,尤其不要命名。 是的,长名称很难键入,但是要获得一个具有自动补全功能的体面的文本编辑器,这将不是问题。 但是,知道一个对象的名称将永远是一件很棒的事。 它为您和其他必须阅读您的代码的人提高了可读性。

也不要在函数内部使用typedef。 如果要定义自定义类型,请在共享的头文件中进行定义。 您不需要在任何地方都声明该类型。 实际上,不要过度使用typedef,只有在提高可读性的情况下才使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM