[英]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.