簡體   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