我是 Eigen 的初学者。我已搜索但未找到此问题的答案。
我有一个双指针数组,即 double** x
我无法控制。它以这种格式出现,我对此无能为力。我想构造一个 Eigen::VectorXd vec
,它使用与 x 指向的内存相同的内存。
换句话说,我希望以下内容成立:
vec(i) == *(x[i]) for each i
和
&vec(i) == x[i] for each i
我希望这是有道理的。我怎样才能做到这一点?
提前致谢!
最佳答案
您想使用一系列 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;
}
输出如下:
Eigen Map : 0 4 8
dblPointer: 0 4 8Addresses:
Eigen: 00622B00
Raw : 00622B00
Eigen Map : 0 2.66667 5.33333 8
dblPointer: 0 2.66667 5.33333 8Addresses:
Eigen: 0061D218
Raw : 0061D218
Eigen Map : 0 2 4 6 8
dblPointer: 0 2 4 6 8Addresses:
Eigen: 0061D240
Raw : 0061D240
Eigen Map : 0 1.6 3.2 4.8 6.4 8
dblPointer: 0 1.6 3.2 4.8 6.4 8Addresses:
Eigen: 006204B0
Raw : 006204B0
如果您想使用一个类似 VectorXd
的对象,请参阅 this问题。
关于c++ - 如何从双指针数组创建 Eigen::VectorXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556684/