2017-10-09 8 views
2

Ich brauche eine Lambda-Funktion, die eine Eigen::VectorXd in eine Eigen::MatrixXd konvertiert und es funktioniert leider nicht, wenn ich versuche, const Referenz zu übergeben. Warum kann ich das nicht tun? Irgendwelche Problemumgehungen?C++ Lambda-Funktion, die Eigen :: VectorXd in Eigen konvertiert :: MatrixXd

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

Die Fehlermeldung ist 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]

+0

Der Compiler sagt Ihnen, dass Sie versuchen, etwas, das Co ist, zu konvertieren nstant ('const Scalar *') zu nicht konstant. Ich habe nicht den 'Eigen'-Header, also nehme ich an, dass' Matrix's Konstruktor das nicht mag 'vec.data()' ist const – ZivS

+0

Versuch, 'typedef Eigen :: Matrix CMat; 'und sehen ob' auto lambda2 = [] (const Vec & vec) {return Eigen: Map (vec.data(), vec.size(), 1);}; 'kompiliert – ZivS

+0

@ZivS Nein, das funktioniert nicht, sorry. – Taylor

Antwort

3

Im konst Fall müssen Sie eine Map<const TYPE> konstruieren: Sie

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

Oder lassen Sie die statische Funktion Matrix::Map hat den richtigen Job:

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