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

时间:2016-02-22 14:52:56

标签: c++ eigen

我是Eigen的初学者。我搜索过但没有找到这个问题的答案。

我有一个双指针数组,即double** x我无法控制。它采用这种格式,我无能为力。我想构造一个使用x指向的相同内存的Eigen::VectorXd vec

换句话说,我希望以下内容成立:

vec(i) == *(x[i]) for each i

&vec(i) == x[i] for each i

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

您想要使用一系列Eigen::Map,但有一点需要注意:&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
  dblPointer:0 4 8

     

地址:
  特征:00622B00
  原始:00622B00

           

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

     

地址:
  特征:0061D218
  原始:0061D218

           

特征图:0 2 4 6 8
  dblPointer:0 2 4 6 8

     

地址:
  特征:0061D240
  原始:0061D240

           

特征图:0 1.6 3.2 4.8 6.4 8
  dblPointer:0 1.6 3.2 4.8 6.4 8

     

地址:
  特征:006204B0
  原始:006204B0

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

答案 1 :(得分:0)

从具有nrow和ncol的double ** 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);

将矩阵映射回temparray:

Map<MatrixXd>(xtemparray, xmatrix.rows(), xmatrix.cols()) = xmatrix;

最后,您可以将xtemparray转换为帖子xarray。

for (i = 0; i < nrow; i++) {
    for (j = 0; j < ncol; j++)
        xpostarray[i][j] = xtemparray[nrow*i + j];
}