在 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 样式矩阵的主要内容,如果未能解决你的问题,请参考以下文章