我继承了一些代码,这些代码广泛使用双指针来表示2D数组。我没有使用Eigen的经验,但它似乎更容易使用,而且比双指针更强大。
有没有人知道哪个更好?
答案 0 :(得分:1)
Eigen和Boost.uBLAS都定义了表达式层次结构和抽象矩阵数据结构,它们可以使用满足某些约束的任何存储类。编写这些库是为了能够清晰地表达线性代数运算并在非常高的水平上进行有效评估。两个库都大量使用表达式模板,并且能够执行非常复杂的编译时表达式转换。特别是,Eigen也可以使用SIMD指令,并且在几个基准测试中具有很强的竞争力。
对于密集矩阵,一种常见的方法是使用单个指针并跟踪其他行,列和步幅变量(您可能需要第三个的原因是因为您可能分配了比实际需要更多的内存因对齐而存储x * y * sizeof(value_type)
个元素。但是,您没有检查超出范围访问的机制,代码中没有任何内容可以帮助您进行调试。例如,如果您需要为教育目的实现一些线性代数运算,那么您只想使用这种方法。 (即使是这种情况,我建议您首先考虑要实现哪些算法,然后查看std::unique_ptr
,std::move
,std::allocator
和运算符重载)
答案 1 :(得分:1)
是的,对于现代C ++,您应该使用容器而不是原始指针。
使用Eigen时,请注意其固定大小的类(如Vector3d
)使用要求它们正确对齐的优化。如果您将那些固定大小的特征值包含在结构或类中的成员,则需要special care。您也can't pass them by value,仅供参考。
如果你不关心这种优化,那么禁用它就足够了:只需添加
#define EIGEN_DONT_ALIGN
作为使用Eigen的所有源文件(.h,.cpp,...)的第一行。
另外两个选项是:
#include <boost/numeric/ublas/matrix.hpp>
boost::numeric::ublas::matrix<double> m (3, 3);
#include <vector>
std::vector<std::vector<double> > m(3, std::vector<double>(3));
答案 2 :(得分:1)
记住Eigen具有Map功能,允许您为连续的数据阵列创建一个Eigen矩阵。如果很难完全改变你继承的代码,那么将事物映射到Eigen矩阵至少可以使原始指针更容易互操作。