2017-10-09 32 views
2

Eigen::VectorXdEigen::MatrixXdに変換するラムダ関数が必要ですが、残念ながらconst参照渡しを試みると動作しません。なぜ私はこれをすることができないのですか?回避策はありますか?Eigen :: VectorXdをEigen :: VectorXdをEigen :: MatrixXdに変換する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; } 

エラーメッセージがconstの場合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

コンパイラは、あなたが何かを変換しようとしていることを伝えますnstant( 'const Scalar *')を非定数にします。私は 'Eigen'ヘッダを持っていないので、' Matrix'のコンストラクタは 'vec.data()'がconstであることを好まないと言っています。 – ZivS

+0

'typedef Eigen :: Matrix (vec.data()、vec.size()、1)を参照してください。 );}; 'コンパイル – ZivS

+0

@ZivSいいえ、うまくいきません、申し訳ありません。 – Taylor

答えて

3

である、あなたは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);}; 
関連する問題