我是Eigen的初学者。我搜索过但没有找到这个问题的答案。
我有一个双指针数组,即double** x
我无法控制。它采用这种格式,我无能为力。我想构造一个使用x指向的相同内存的Eigen::VectorXd vec
。
换句话说,我希望以下内容成立:
vec(i) == *(x[i]) for each i
和
&vec(i) == x[i] for each i
我希望这是有道理的。我怎样才能做到这一点?
提前致谢!
答案 0 :(得分:1)
您想要使用一系列Eigen::Map
,但有一点需要注意:&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
dblPointer:0 4 8地址:
特征:00622B00
原始:00622B00Eigen Map:0 2.66667 5.33333 8
dblPointer:0 2.66667 5.33333 8地址:
特征:0061D218
原始:0061D218特征图:0 2 4 6 8
dblPointer:0 2 4 6 8地址:
特征:0061D240
原始:0061D240特征图:0 1.6 3.2 4.8 6.4 8
dblPointer:0 1.6 3.2 4.8 6.4 8地址:
特征:006204B0
原始:006204B0
如果您想使用一个类似VectorXd
的对象,请参阅this问题。
答案 1 :(得分:0)
从具有nrow和ncol的double ** 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);
将矩阵映射回temparray:
Map<MatrixXd>(xtemparray, xmatrix.rows(), xmatrix.cols()) = xmatrix;
最后,您可以将xtemparray转换为帖子xarray。
for (i = 0; i < nrow; i++) {
for (j = 0; j < ncol; j++)
xpostarray[i][j] = xtemparray[nrow*i + j];
}