2

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

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

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

使用 stl-vectors 应该很容易做到这一点:

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

我可以动态地迭代外部 2 维并根据需要填充内部 2 维的替代项(例如使用 push_back())。

问题:

  • Boost.MultiArray 是否可以定义这种数据结构?如何?
  • 使用 Boost.MultiArray 而不是嵌套向量是个好主意吗?性能(尤其是查找!(内存布局))?易于使用?

感谢您的任何意见!

萨沙

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

编辑: 目前我正在考虑另一种方法:将备选方案展平-> 一个更大的矩阵,其中包含备选方案之间的所有距离。然后我只需要计算每个节点的备选数量,建立前缀总和(描述矩阵位置/移位),然后可以分两步访问信息。

但我的问题仍然悬而未决。

4

2 回答 2

2

听起来你需要:

multi_array<ublas::matrix<type>,2>
于 2010-10-29T16:08:44.647 回答
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,最多将它用于内部数组。在另一个答案中提到了这一点。typeboost::multi_array<boost::ublas::array<type>, 2> data

于 2015-11-11T19:18:38.653 回答