在 Eigen 中使用原始 c 样式矩阵

Posted

技术标签:

【中文标题】在 Eigen 中使用原始 c 样式矩阵【英文标题】:Using raw c style matrix in Eigen 【发布时间】:2016-12-02 05:28:57 【问题描述】:

有没有一种简单的方法可以将double** 包装在 c++ Eigen 类型中,以便可以在 Eigen 表达式中使用?据我所知,Eigen::Map 类只支持double*double** 指向的存储不保证是连续的。

【问题讨论】:

Map a Eigen Matrix to an C array的可能重复 Convert Eigen Matrix to C array 正如我的问题中所述,我想包装一个 C 矩阵而不是 C 数组。这两个链接仅显示了 Eigen::Map 与 C 数组的用法。 double** 指向的存储不保证是连续的。 C 中没有矩阵类型。如果您自己创建它,那么您必须手动使用它们 @Jodebo double** 不是矩阵,假设数组衰减,它充其量只是一个数组数组。它不能保证矩形大小,这对于矩阵来说非常重要,这是 IMO 的一个更大的问题。 【参考方案1】:

正如您所指出的,您可以使用Eigen::Map 来包装连续数据:

double *data = new...
Map<MatrixXd> mappedData(data, m, n);
mappedData.transposeInPlace(); // etc.

非连续数据必须是连续的,或者作为copy in an Eigen object,或者作为连续的double*并使用Map,如上所述。

编辑

您不能使用(映射/包装)内存的非连续部分作为 Eigen::Matrix。如果您可以控制内存分配,则可以执行以下操作:

// make contiguous data array; better yet, make an
// Eigen::VectorXd of the same size to ensure alignment
double *actualData = new double[m*n]; 
double **columnPointers = new double[n];
for(int i = 0; i < n; ++i) columnPointers[i] = actualData + i * m;
... // do whatever you need to do with the double**
Map<MatrixXd> mappedData(actualData, m, n);
... // send to ceres, or whatever

【讨论】:

我不想复制数据,我想包装它。我想将它与ceres::DynamicAutoDiffCostFunction Link 一起使用,复制可能太贵了。

以上是关于在 Eigen 中使用原始 c 样式矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Eigen求矩阵行列式

使用 Eigen 3.3.3 进行矩阵运算

将动态矩阵转换为 Eigen 中的固定矩阵

EIgen基本运算学习

EIgen基本运算学习

矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现