使用特征与双指针的矩阵表示

Matrix representation using Eigen vs double pointer

本文关键字:表示 指针 特征      更新时间:2023-10-16

我继承了一些广泛使用双指针来表示二维数组的代码。 我几乎没有使用本征的经验,但它似乎比双指针更容易使用且更健壮。

有没有人知道哪个更可取?

Eigen 和 Boost.uBLAS 都定义了表达式层次结构和抽象矩阵数据结构,这些结构可以使用满足某些约束的任何存储类。编写这些库是为了在非常高的级别上清楚地表达和有效地评估线性代数运算。这两个库都大量使用表达式模板,并且能够执行非常复杂的编译时表达式转换。特别是,Eigen 还可以使用 SIMD 指令,并且在多个基准测试上非常具有竞争力。

对于密集矩阵,一种常见的方法是使用单个指针并跟踪其他行、列和步幅变量(您可能需要第三个变量的原因是,由于对齐,您可能分配了比实际需要存储x * y * sizeof(value_type)元素更多的内存)。 但是,您没有适当的机制来检查超出范围的访问,代码中也没有帮助您进行调试的内容。例如,当您需要实现一些线性代数运算用于教育目的时,您才希望使用这种方法。(即使是这种情况,我建议你首先考虑你想实现哪些算法,然后再看看std::unique_ptrstd::movestd::allocator和运算符重载)。

请记住,

特征具有映射功能,允许您为连续的数据数组创建特征矩阵。 如果很难完全更改您继承的代码,那么将内容映射到特征矩阵至少可能会使与原始指针的互操作更容易。

是的,当然,对于现代C++,您应该使用容器而不是原始指针。

特征

使用特征码时,请注意其固定大小类(如Vector3d)使用需要它们正确对齐的优化。如果将这些固定大小的特征值作为成员包含在结构或类中,则需要特别小心。您也不能按值传递它们,只能按引用传递它们。

如果您不关心此类优化,那么禁用它就足够微不足道了:只需添加

#define EIGEN_DONT_ALIGN

作为使用特征的所有源文件(.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));