我想翻译一些现有的Matlab代码,这些代码很自然地使用了很多多维数组,我想知道有哪些可能的选项。我希望容器具有复制构造函数,默认构造函数,如果可能,在编译时清除错误消息,通过A[i][j]
访问,并且通常不会麻烦。最好,他们应该使用std::move
操作来提高速度。
据我所知,选项归结为:
std::vector
迭代。它确实有效,但为3D阵列编写std::vector<std::vector<std::vector<double> > >
似乎很愚蠢。我也关注速度和记忆的开销。
boost::multiarray和blitz::Array提供了大部分功能,但在运行时复制构造函数(请参阅stackoverflow)失败。我不清楚是否有正当理由。
Eigen库似乎非常快,但它根本不允许复制,并且没有默认构造函数,这意味着必须使用另一个容器。
std::array
的缺点是在创建对象时必须知道大小,因此没有默认的构造函数。
是否有一个更简单的多维容器满足所有请求,但比迭代std::vector
更节俭?
答案 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)
答案 2 :(得分:0)