Boost.MultiArray初学者:如何获得具有动态内部数组大小的4D阵列?

时间:2010-10-29 15:50:07

标签: c++ boost stl multidimensional-array boost-multi-array

我想存储某种距离矩阵(2D),其中每个条目都有一些替代(不同的坐标)。所以我想访问距离,例如x = 1,其中x_alt = 3,y = 3,y_alt = 1,查看带有数组[1] [3] [3] [1]的4维多阵列。< / p>

需要注意的重要事项如下:2个最内部的数组/向量对于外部数据的不同值没有相同的大小。

在第一个初始化步骤之后,我计算值,不再需要修改!

使用stl-vectors很容易实现这一点:

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

我可以在外部2个维度上动态迭代,并且只填充内部2维度的替代项(例如使用push_back())。

问题:

  • 使用Boost.MultiArray可以实现这种数据结构定义吗?怎么样?
  • 使用Boost.MultiArray代替嵌套向量是一个好主意吗?性能(尤其是查找!(内存布局))?易于使用?

感谢您的任何意见!

的Sascha

PS:提升文档对我没有帮助。也许可以使用multi_array_ref将已经大小的数组放入整个4D结构中?

修改 目前我正在考虑另一种方法:扁平化替代方案 - &gt;一个更大的矩阵,具有替代方案之间的所有距离。然后我只需要计算每个节点的备选数量,建立前缀总和(它描述矩阵位置/移位),然后可以两步访问信息。

但我的问题仍然存在。

2 个答案:

答案 0 :(得分:2)

听起来你需要:

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

答案 1 :(得分: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在另一个答案中提及。