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

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

本文关键字:Eigen VectorXd MatrixXd 转换 lambda 函数 用于 c++      更新时间:2023-10-16

我需要一个将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; }

错误消息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]

在 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);};