c ++ lambda函数将Eigen :: VectorXd转换为Eigen :: MatrixXd

时间:2017-10-09 18:40:28

标签: c++ lambda eigen

我需要一个将Eigen::VectorXd转换为Eigen::MatrixXd的lambda函数,不幸的是,当我尝试通过const引用时,它不起作用。为什么我不这样做?任何解决方法?

#include <Eigen/Dense>
#include <iostream>

typedef Eigen::Matrix< double, Eigen::Dynamic, 1              > Vec; 
typedef Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > Mat;

int main(int argc, char **argv) {

    Vec v (3);
    v(0) = 1.0;
    v(1) = 2.0;
    v(2) = 3.0;


    auto lambda = [](Vec vec) {return Eigen::Map<Mat>(vec.data(), vec.size(), 1);};
    Mat m = lambda(v);

    std::cout << m(0,0) << "\n";
    std::cout << m(1,0) << "\n";
    std::cout << m(2,0) << "\n";

    // does not work
    auto lambda2 = [](const Vec& vec) {return Eigen::Map<Mat>(vec.data(), vec.size(), 1);};

    return 0; }

错误讯息为error: invalid conversion from 'const Scalar* {aka const double*}' to 'Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<0, 0> >::PointerArgType {aka double*}' [-fpermissive]

1 个答案:

答案 0 :(得分:3)

在const情况下,您必须构造Map<const TYPE>

auto lambda2 = [](const Vec& vec) {return Eigen::Map<const Mat>(vec.data(), vec.size(), 1);};

或者让静态函数Matrix::Map为您做正确的工作:

auto lambda2 = [](const Vec& vec) {return Mat::Map(vec.data(), vec.size(), 1);};