2010-10-29 10 views
2

我想存儲某種距離矩陣(2D),其中每個條目都有一些替代(不同的座標)。所以我想訪問距離,例如x_alt = 3和y = 3,y_alt = 1時x = 1,查看帶有數組[1] [3] [3] [1]的4維多陣列。Boost.MultiArray初學者:如何獲得具有動態內部數組大小的4D數組?

重要的是要注意以下幾點:2個最內部的數組/矢量對於不同的外部數值不同。

經過第一個初始化步驟後,我計算值,不需要更多的修改!

這應該是容易實現與使用STL-載體:

vector<vector<vector<vector<double> > > >`extended_distance_matrix; 

其中i可以動態地遍歷外2點的尺寸和作爲我需要只填充儘可能多的替代的內2點的尺寸(例如與push_back())。

問題:

  • 就是這種數據結構的定義可能與Boost.MultiArray的?怎麼樣?
  • 使用Boost.MultiArray代替嵌套向量是個好主意嗎?性能(尤其是查找!(內存佈局))?易於使用?

感謝您的任何意見!

薩沙

PS:Boost文檔並沒有幫助我。也許我們可以使用multi_array_ref將已經大小的數組放入整個4D結構中?

編輯: 目前,我正在考慮的另一種方法:扁平化的替代品 - >所有的替代品之間的距離更大的一個矩陣。然後,我只需要計算每個節點的選項數量,建立前綴和(它描述了矩陣的位置/移位),然後可以以兩步方式訪問信息。

但我的問題仍然存在。

+0

我基本上有同樣的問題。你還記得你最終使用的是什麼嗎?質疑Boost.MultiArray是否是4D結構的好主意。 (我知道這是近5年前...但任何建議表示讚賞。) – snd 2015-08-22 09:04:07

+1

@snd - 不知道是否爲時已晚,但Anycorn建議的基本正確。你將初始化一個二維數組的二維數組(如果你有'ublas :: matrix > my4D(ySize,y_altSize)'''''')。然後,當你計算出每個內部矩陣的正確大小時,你可以調用'my4D(yIndex,y_altIndex).resize(xSize,x_altSize);' – NoseKnowsAll 2015-10-16 16:00:27

+1

@snd如果你可以計算出陣列中每個維數的大小初始化它們,然後你應該使用'boost :: multi_array my4D(boost :: extents [xSize] [x_altSize] [ySize] [y_altSize]);'並沿着找到的指南[here](http:// www .boost.org/DOC /庫/ 1_59_0 /庫/的multi_array/DOC/user.html)。由於數據局部性,這應該比上述方法快得多。 – NoseKnowsAll 2015-10-16 16:04:55

回答

2

它聽起來像您需要:

multi_array<ublas::matrix<type>,2> 
+0

2 dim矩陣的2 dim陣列?你能詳細解釋一下嗎?你會在哪裏保存動態部分(替代品)。這將如何索引?外部數組由[x] [y]索引。也許對象的id - > x到y的距離。但是,替代選擇應該如何編碼呢?現在我有4個索引(每個數組部分2個)用於編碼2索引信息(每個ID的一個替代決策)?你知道,我在理解你的建議時遇到了問題。 – sascha 2010-10-29 16:37:05

0

與連續的存儲器(在許多方面邏輯地佈置)Boost.MultiArray的優惠所以難以在內部尺寸添加元素。 MultiArrays可以動態調整大小,例如在任何維度添加元素,但這是一個昂貴的操作,幾乎肯定需要(內部)重新分配和複製。

因爲這個要求,MultiArray不是最好的選擇。但從你所說的看起來,這兩者的組合對你來說是合適的。

boost::multi_array<std::vector<std::vector<type>>, 2> data

的非常好的一點是,索引界面不相對於改變boost::multi_array<type, 4>。例如data[1][2][3][4]仍然有意義。

我不從您的帖子知道你是怎麼處理的內部尺寸,但它甚至可能是有意義的使用:

boost::multi_array<boost::multi_array<type>, 2>, 2> data

在任何情況下,除非你真的需要做線性代數的我將遠離boost::ublas::array,或者至多使用它作爲內部數組,如果type是數字。 boost::multi_array<boost::ublas::array<type>, 2> data這是在其他答案中提到的。