如何从双指针数组创建 Eigen::VectorXd
Posted
技术标签:
【中文标题】如何从双指针数组创建 Eigen::VectorXd【英文标题】:How to create Eigen::VectorXd from an array of double pointers 【发布时间】:2016-02-22 14:52:55 【问题描述】:我是 Eigen 的初学者。我已搜索但未找到此问题的答案。
我有一个双指针数组,即double** x
,我无法控制它。它采用这种格式,我对此无能为力。我想构造一个Eigen::VectorXd vec
,它使用与 x 所指向的内存相同的内存。
换句话说,我希望以下内容成立:
vec(i) == *(x[i]) for each i
和
&vec(i) == x[i] for each i
我希望这是有道理的。我怎样才能做到这一点?
提前致谢!
【问题讨论】:
【参考方案1】:您想使用一系列Eigen::Map
s,但有一个警告:不是&vec
等于x[i]
,而是vec.data()
。这是一个完整的例子:
#include "Eigen/Core"
#include <iostream>
int main()
int outerLength = 4;
int *szPointer;
double **dblPointer;
szPointer = new int[outerLength];
dblPointer = new double*[outerLength];
for (int i = 0; i < outerLength; i++)
szPointer[i] = 3 + i;
dblPointer[i] = new double[szPointer[i]];
for (int i = 0; i < outerLength; i++)
Eigen::Map<Eigen::VectorXd> mapThatActsLikeVector(dblPointer[i], szPointer[i]);
mapThatActsLikeVector.setLinSpaced(0, 8);
std::cout << "----------------------------------\n";
std::cout << "Eigen Map :\t" << mapThatActsLikeVector.transpose() << "\n";
std::cout << "dblPointer:\t" << dblPointer[i][0];
for (int j = 1; j < szPointer[i]; j++)
std::cout << " " << dblPointer[i][j];
std::cout << "\n\nAddresses:\n";
std::cout << "Eigen:\t" << mapThatActsLikeVector.data() << "\n";
std::cout << "Raw :\t" << dblPointer[i] << "\n\n";
for (int i = 0; i < outerLength; i++)
delete[] dblPointer[i];
delete[] dblPointer;
delete[] szPointer;
return 0;
输出类似:
特征图:0 4 8 dbl指针:0 4 8
地址: 特征:00622B00 原始:00622B00
特征图:0 2.66667 5.33333 8 dbl指针:0 2.66667 5.33333 8
地址: 特征:0061D218 原始:0061D218
特征图:0 2 4 6 8 dbl指针:0 2 4 6 8
地址: 特征:0061D240 原始:0061D240
特征图:0 1.6 3.2 4.8 6.4 8 dbl指针:0 1.6 3.2 4.8 6.4 8
地址: 特征:006204B0 原始:006204B0
如果您想使用单个类似VectorXd
的对象,请参阅this 问题。
【讨论】:
感谢您的回答,对我迟到的回复感到抱歉。但是,我认为您误解了我的问题,或者我不够清楚。我帖子中的 x 包含指向我在 Eigen::VectorXd 中需要的变量的指针,即它们不是(必然)在连续内存中。我希望 *x[0] 是 vec 中的第一个值, *x[1] 是第二个,等等。 这并不重要,因为我希望使用 Unsupported Levenerg Marquardt 求解器,但它似乎不支持 Eigen::Maps。但是,我仍然很想知道我的 OP 是否可以解决。【参考方案2】:从具有 nrow 和 ncol 的双 **xarray 开始。
xarray = new double *[nrow];
for (i = 0; i < nrow; i++)
xarray[i] = new double[ncol];
用值填充它。
然后创建 double *xtemparray,它是一个维度为 nrow * ncol 的向量。
xtemparray = new double [nrow*ncol];
将 xarray 中的值放入 xtemparray。
for (i = 0; i < nrow; i++)
for (j = 0; j < ncol; j++)
xtemparray[nrow*i + j] = xarray[i][j];
声明矩阵。
MatrixXd xmatrix(nrow, ncol);
然后您可以将 xtemparray 映射到 xmatrix。
xmatrix = Map<Matrix<double,Dynamic,Dynamic,RowMajor>>(xtemparray, nrow, ncol);
将矩阵映射回临时数组:
Map<MatrixXd>(xtemparray, xmatrix.rows(), xmatrix.cols()) = xmatrix;
最后,您可以将 xtemparray 转换为 post xarray。
for (i = 0; i < nrow; i++)
for (j = 0; j < ncol; j++)
xpostarray[i][j] = xtemparray[nrow*i + j];
【讨论】:
以上是关于如何从双指针数组创建 Eigen::VectorXd的主要内容,如果未能解决你的问题,请参考以下文章