gpt4 book ai didi

c++ - 如何从双指针数组创建 Eigen::VectorXd

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:34 26 4
gpt4 key购买 nike

我是 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 8

Addresses:
Eigen: 00622B00
Raw : 00622B00


Eigen Map : 0 2.66667 5.33333 8
dblPointer: 0 2.66667 5.33333 8

Addresses:
Eigen: 0061D218
Raw : 0061D218


Eigen Map : 0 2 4 6 8
dblPointer: 0 2 4 6 8

Addresses:
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 8

Addresses:
Eigen: 006204B0
Raw : 006204B0

如果您想使用一个类似 VectorXd 的对象,请参阅 this问题。

关于c++ - 如何从双指针数组创建 Eigen::VectorXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com