Taylor
Taylor

Reputation: 2085

c++ lambda function that converts Eigen::VectorXd to Eigen::MatrixXd

I need a lambda function that converts an Eigen::VectorXd to a Eigen::MatrixXd and unfortunately it doesn't work when I try to pass by const reference. Why can't I do this? Any workarounds?

#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; }

The error message is 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]

Upvotes: 2

Views: 474

Answers (1)

ggael
ggael

Reputation: 29255

In the const case, you must construct a Map<const TYPE>:

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

Or let the static function Matrix::Map does the right job for you:

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

Upvotes: 3

Related Questions