从函数中传递几个boost multi_array

时间:2014-09-11 15:09:47

标签: c++ boost

我在函数中使用boost :: multi_array生成了一堆3d数组。我不想在我的另一个代码中使用所有这些数组是否有任何方法可以做到这一点?

当我有一个2d案例时,我所做的是

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,以便我可以将它们用作其他代码位的源。

1 个答案:

答案 0 :(得分:0)

在我看来,最优雅的解决方案就是如此声明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];

然后你可以使用l,好像它是你的三维数组。

PS:永远不要命名xM,特别是不是类型。是长名称是一种痛苦的类型,但得到一个体面的文本编辑器与自动完成,它不会是一个问题。 然而,通过它的名字知道对象是什么,总是很棒。它为您和任何必须阅读您代码的人提供了可读性。

也不要在函数内部输入type。如果要定义自定义类型,请在共享的头文件中执行此操作。 您不希望必须在任何地方声明该类型。 实际上不要过度使用typedef,只有在提高可读性时才使用它。

相关问题