【问题标题】:Boost.MultiArray Beginner: How to get a 4D-Array with dynamic inner-array-sizes?Boost.MultiArray 初学者:如何获得具有动态内部数组大小的 4D 数组?
【发布时间】: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&lt; ublas::matrix&lt;double&gt; &gt; my4D(ySize, y_altSize);)。然后当你计算出每个内部矩阵的正确大小时,你会调用my4D(yIndex, y_altIndex).resize(xSize, x_altSize);
  • @snd 如果您可以在初始化数组之前计算出数组每个维度的大小,那么您应该使用boost::multi_array&lt;double, 4&gt; 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


【解决方案1】:

Boost.MultiArray 处理连续的内存(在许多维度上逻辑排列),因此很难在内部维度中添加元素。 MultiArrays 可以动态调整大小,例如添加任何维度的元素,但这是一项代价高昂的操作,几乎肯定需要(内部)重新分配和复制。

由于该要求 MultiArray 不是最佳选择。但从你所说的看来,这两者的结合对你来说是合适的。

boost::multi_array&lt;std::vector&lt;std::vector&lt;type&gt;&gt;, 2&gt; data

非常好的一点是索引界面不会相对于boost::multi_array&lt;type, 4&gt; 发生变化。例如data[1][2][3][4] 仍然有意义。

我从您的帖子中不知道您如何处理内部维度,但使用它甚至可能有意义:

boost::multi_array&lt;boost::multi_array&lt;type&gt;, 2&gt;, 2&gt; data

无论如何,除非你真的需要做线性代数,否则我会远离boost::ublas::array,或者如果type 是数字,最多将它用于内部数组。 boost::multi_array&lt;boost::ublas::array&lt;type&gt;, 2&gt; data 在另一个答案中提到。

【讨论】:

    【解决方案2】:

    听起来你需要:

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

    【讨论】:

    • 二维矩阵的二维数组?你能更详细地解释一下吗?您将在哪里保存动态部分(替代方案)。这将如何被索引?外部数组由 [x][y] 索引。也许是对象的 id -> 从 x 到 y 的距离。但是应该如何对替代选择进行编码?现在我有 4 个索引(每个数组部分 2 个)用于编码 2 索引信息(每个 id 一个替代决策)?你看,我在理解你的提议时遇到了问题。
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2021-06-13
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多