【发布时间】:2011-05-02 11:58:33
【问题描述】:
我想存储某种距离矩阵 (2D),其中每个条目都有一些替代项(不同的坐标)。所以我想访问距离,例如 x_alt=3 的 x=1 和 y_alt=1 的 y=3,查看带有 array[1][3][3][1] 的 4-dim 多数组。
需要注意的重要一点是:最内部的 2 个数组/向量对于外部的不同值的大小不同。
在我计算值的第一个初始化步骤之后,不再需要修改!
这应该可以通过使用 stl-vector 轻松实现:
vector<vector<vector<vector<double> > > >`extended_distance_matrix;
我可以动态迭代外部 2 维,并根据需要仅填充内部 2 维的替代项(例如使用 push_back())。
问题:
- 这种数据结构定义是否可以使用 Boost.MultiArray?怎么样?
- 使用 Boost.MultiArray 代替嵌套向量是个好主意吗?性能(尤其是查找!(内存布局))?好用吗?
感谢您的任何意见!
萨沙
PS:boost 文档对我没有帮助。也许可以使用 multi_array_ref 将已经确定大小的数组放入整个 4D 结构中?
编辑: 目前我正在考虑另一种方法:将替代方案展平 - >一个更大的矩阵,其中包含替代方案之间的所有距离。然后我只需要计算每个节点的备选方案数量,建立前缀总和(描述矩阵位置/移位),然后可以分两步访问信息。
但我的问题仍然悬而未决。
【问题讨论】:
-
我基本上有同样的问题。你还记得你最终使用了什么吗?质疑 Boost.MultiArray 是否适合 4D 结构。 (我知道这几乎是 5 年前的事了......但任何建议都值得赞赏。)
-
@snd - 不知道是否为时已晚,但 Anycorn 的建议基本上是正确的。您将初始化 2D 数组的 2D 数组(如果您有 boost
ublas::matrix< ublas::matrix<double> > my4D(ySize, y_altSize);)。然后当你计算出每个内部矩阵的正确大小时,你会调用my4D(yIndex, y_altIndex).resize(xSize, x_altSize); -
@snd 如果您可以在初始化数组之前计算出数组每个维度的大小,那么您应该使用
boost::multi_array<double, 4> my4D(boost::extents[xSize][x_altSize][ySize][y_altSize]);并按照here 中的指南进行操作。由于数据局部性,这应该比上述方法快得多。 -
感谢@NoseKnowsAll。我开始使用Armadillo,但这提醒我需要检查 Arma 与 Boost 的速度
-
@snd 如果您对它进行基准测试,请确保关闭 boost 库中默认启用的所有调试选项。但是,是的,如果您想要 3D 阵列,犰狳可能是您的最佳选择。我不知道它可以去4D虽然。另外,如果您只处理二维数组,我强烈建议您使用 Eigen。干杯。
标签: c++ boost stl multidimensional-array boost-multi-array