【问题标题】:How to create Eigen::VectorXd from an array of double pointers如何从双指针数组创建 Eigen::VectorXd
【发布时间】: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

我希望这是有道理的。我怎样才能做到这一点?

提前致谢!

【问题讨论】:

    标签: c++ eigen


    【解决方案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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多