如何从双指针数组创建 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::Maps,但有一个警告:不是&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的主要内容,如果未能解决你的问题,请参考以下文章

从双数组中获取最小值不起作用

如何使用 NAudio 播放双数组(包括波浪)[关闭]

如何创建指针数组?

如何创建指向与 VST 音频缓冲区相同的指针数组的指针?

如何创建指向继承类对象的指针数组

如何从双精度中删除尾随零 [重复]