2017-10-09 173 views
2

我需要一個lambda函數來將Eigen::VectorXd轉換爲Eigen::MatrixXd,不幸的是,當我嘗試傳遞const引用時,它不起作用。爲什麼我不能這樣做?任何解決方法?將Eigen :: VectorXd轉換爲Eigen :: MatrixXd的C++ lambda函數

#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]

+0

編譯器告訴你,你正試圖轉換一些是co nstant('const Scalar *')爲非常量。我沒有'Eigen'頭文件,所以我在這裏猜測說'Matrix'的構造函數不像'vec.data()'是const – ZivS

+0

嘗試添加'typedef Eigen :: Matrix (vec.data(),vec.size(),1 );};'編譯 – ZivS

+0

@ZivS沒有不行,對不起。 – Taylor

回答

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);}; 
相關問題