如何从具有运行时维度的特征矩阵创建行主C数组?

时间:2018-02-06 14:56:09

标签: eigen

以下两篇文章非常有用,但并不完全符合我的要求:

但是,我需要从Eigen :: MatrixXd创建一个行主C数组(参见2),我需要能够在运行时指定维度。意思是,我制作了一个接口,让我传递一个Eigen :: MatrixXd以及它的尺寸和预分配的目标C数组。

这可行,但是是专栏,

void eigen_matrixXd_to_double_array(const Eigen::MatrixXd& evector, double* destination, uint32_t nrow, uint32_t ncol)
{
    Eigen::Map<Eigen::MatrixXd>(destination,nrow,ncol) = evector;
}

我想要类似的东西:

    void eigen_matrixXd_to_double_array(const Eigen::MatrixXd& evector, double* destination, uint32_t nrow, uint32_t ncol)
{
    Eigen::Map<Eigen::Matrix<double, nrow, ncol, Eigen::RowMajor>>(destination,nrow,ncol) = evector;
}

或,

    void eigen_matrixXd_to_double_array(const Eigen::MatrixXd& evector, double* destination, uint32_t nrow, uint32_t ncol)
{
    Eigen::Map<Eigen::MatrixXd<Eigen::RowMajor>>(destination,nrow,ncol) = evector;
}

但这些都不起作用......

有什么建议吗?我是否可以使用编程维度进行行主映射(意识到C接口的用户必须正确调整dims)?

提前致谢...

1 个答案:

答案 0 :(得分:2)

你非常接近:

typedef Matrix<double,Dynamic,Dynamic,RowMajor> RowMajMat;
RowMajMat::Map(destination, evector.rows(), evector.cols()) = evector;

此处,RowMajMat::Map是一个返回Map<RowMajMat>的静态方法,因此您也可以编写Map<RowMajMat>(destination, evector.rows(), evector.cols())