C ++多维数组的可能性

时间:2014-11-13 12:44:36

标签: c++ arrays matlab c++11 boost

我想翻译一些现有的Matlab代码,这些代码很自然地使用了很多多维数组,我想知道有哪些可能的选项。我希望容器具有复制构造函数,默认构造函数,如果可能,在编译时清除错误消息,通过A[i][j]访问,并且通常不会麻烦。最好,他们应该使用std::move操作来提高速度。

据我所知,选项归结为:

  • std::vector迭代。它确实有效,但为3D阵列编写std::vector<std::vector<std::vector<double> > >似乎很愚蠢。我也关注速度和记忆的开销。

  • boost::multiarrayblitz::Array提供了大部分功能,但在运行时复制构造函数(请参阅stackoverflow)失败。我不清楚是否有正当理由。

  • Eigen库似乎非常快,但它根本不允许复制,并且没有默认构造函数,这意味着必须使用另一个容器。

  • std::array的缺点是在创建对象时必须知道大小,因此没有默认的构造函数。

是否有一个更简单的多维容器满足所有请求,但比迭代std::vector更节俭?

3 个答案:

答案 0 :(得分:1)

我不确定这可以满足您的所有需求,但我自己必须处理多维数组来创建网格/网格,并希望为此创建自己的类。
我的课程让我们称之为 MultiArray 使用一维向量作为容器。

例如,写 MultiArray&lt; 4,float,10,15,10,18&gt; A()会在大小为10 * 15 * 10 * 18的向量中创建一个多数组A [10] [15] [10] [18]。

我可以通过单个索引 A(i)或坐标A [i] [j] [k] [l]通过调用 A({i,j, K,L})。出于性能目的,我已在构造函数中预先计算了维度的乘积,以便快速计算坐标 - >索引或索引 - >坐标。

代码对于N维是通用的。如果你愿意,我可以详细介绍一些部分。

答案 1 :(得分:1)

有一个很好的线性代数包叫做Armadillo

http://arma.sourceforge.net/

将它与R,快乐用户

一起使用

答案 2 :(得分:0)

您错过了另一种选择:

  • 的std ::的valarray

根据您的要求,它可能会有用。 http://www.cplusplus.com/reference/valarray/