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

标签 c++ eigen

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

相关文章:

c++ - 从派生类调用的复制构造函数

c++ - 提取点 vector 内的区域

c++ - Eigen 对 Rows 模板的可变模板扩展有问题

c++ - 如何用-1无循环初始化整个数组

c++ - 生成 2 到 10,000 之间的数字。打印出来的数字只能是2个质数的倍数

c++ - 将类型与特征矩阵混合的错误

c++ - 无法访问特征线性系统解决方案的元素

c++ - 有没有办法在 Eigen (C++) 中存储阈值操作输出?

c++ - 为什么 RegSetValueEx 即使在我违反有关计算长度中 NUL 终止的规则时仍然有效?

c++ - 教Google-Test如何打印特征矩阵