使用特征与双指针的矩阵表示
Matrix representation using Eigen vs double pointer
我继承了一些广泛使用双指针来表示二维数组的代码。 我几乎没有使用本征的经验,但它似乎比双指针更容易使用且更健壮。
有没有人知道哪个更可取?
Eigen 和 Boost.uBLAS 都定义了表达式层次结构和抽象矩阵数据结构,这些结构可以使用满足某些约束的任何存储类。编写这些库是为了在非常高的级别上清楚地表达和有效地评估线性代数运算。这两个库都大量使用表达式模板,并且能够执行非常复杂的编译时表达式转换。特别是,Eigen 还可以使用 SIMD 指令,并且在多个基准测试上非常具有竞争力。
对于密集矩阵,一种常见的方法是使用单个指针并跟踪其他行、列和步幅变量(您可能需要第三个变量的原因是,由于对齐,您可能分配了比实际需要存储x * y * sizeof(value_type)
元素更多的内存)。 但是,您没有适当的机制来检查超出范围的访问,代码中也没有帮助您进行调试的内容。例如,当您需要实现一些线性代数运算用于教育目的时,您才希望使用这种方法。(即使是这种情况,我建议你首先考虑你想实现哪些算法,然后再看看std::unique_ptr
、std::move
、std::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));
- 数组指针表示法C++(移动数组时)
- 使用指针计算堆栈问题的大 O 表示法
- 使用 int 指针的浮点数的位表示形式
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- C++指针表示法
- char p[0]表示自动分配的缓冲区还是安全指针
- 如何以指针格式表示多维数组?
- 如何将升压数组表示为类型的指针?
- 指针符号在参数规范中表示什么,例如:(char16 *缓冲区,int32 大小)?C++
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- C 中的动态数组(用指针表示) - 输入元素
- 指针内存表示和继承铸造
- 可以从指向子对象的指针中获取指向完整对象表示元素的指针吗
- 指向对象表示元素或指向提供的存储元素的指针
- 在 C 和指针表示法中放置星号的位置C++
- 指向成员表示的指针
- 为什么使用构造函数调用表示法定义指向指针变量的指针是非法的
- 如何在指针表示法和数组表示法中循环遍历二维数组
- 如何表示指向地址空间开头的指针
- 为什么我们需要不同的数据类型来表示指针