将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]

Posted

技术标签:

【中文标题】将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]【英文标题】:Error storing data from std::Vector to Eigen::Vector [duplicate] 【发布时间】:2020-01-03 08:46:35 【问题描述】:
*error: no matching function for call to object of type 'Eigen::VectorXd' (aka 'Matrix<double, Dynamic, 1>')
DenseCoeffsBase.h:362:5: note: candidate function not viable: no known conversion from 'double *' to 'Eigen::Index' (aka 'long long') for 1st argument; dereference the argument with *
DenseCoeffsBase.h:115:41: note: candidate function not viable: no known conversion from 'double *' to 'Eigen::Index' (aka 'long long') for 1st argument; dereference the argument with *
DenseCoeffsBase.h:178:5: note: candidate function not viable: requires single argument 'index', but 2 arguments were provided
DenseCoeffsBase.h:423:5: note: candidate function not viable: requires single argument 'index', but 2 arguments were provided*

以上是我尝试将数据从标准向量存储到特征向量时提供的错误消息

这就是我想要做的。我已经在通过这些命令返回的其他文件中制作了标准向量,然后必须将它们转换为特征样式向量以与其他一些代码集成。我尝试寻找将标准向量数据存储到特征中的方法,我发现这种特殊方式在另一个堆栈溢出帖子上。我不明白错误消息的含义。谁能告诉我我做错了什么?

另外为了打印数据,我得到了这个错误 “必须调用对非静态成员函数的引用:你的意思是不带参数调用它”

我以为我通过调整大小使其成为静态矢量。

非常感谢您的帮助,并将添加任何必要的信息。我是 C++ 的新手,希望能得到一些更简单的解释,因为我并不精通所有基础知识。

    simulator.h

    Eigen::VectorXd currentStartMassVector_, currentEndMassVector_ ,specificImpulses_   ;
    std::vector<double>       StartMassVector_, endMassVector_ , SpecificImpulseVector_  ;

    simulator.cpp

    currentStartMassVector_.resize(numberOfStages_);
    currentEndMassVector_.resize(numberOfStages_);
    specificImpulses_.resize(numberOfStages_);

    StartMassVector_            = launchVehicle->getMassStartStages();
    endMassVector_              = launchVehicle->getMassEndStages();
    SpecificImpulseVector_      = launchVehicle->getCurrentSpecificImpulse();

    currentStartMassVector_(StartMassVector_.data(),StartMassVector_.size())  ;
    currentEndMassVector_(endMassVector_.data(),endMassVector_.size()) ;
    specificImpulses_(SpecificImpulseVector_.data(),SpecificImpulseVector_.size());

        std::cout << "start mass vector" <<  currentStartMassVector_.transpose << std::endl;
        std::cout << "end mass vector"   <<  currentEndMassVector_.transpose << std::endl;
        std::cout << "Isp vector" <<  specificImpulses_.transpose << std::endl;

【问题讨论】:

您希望Eigen::VectorXd(又名Eigen::Matrix)的什么功能提供这样的转换?请注意,您在此处调用 函数调用运算符currentStartMassVector_(StartMassVector_.data(),StartMassVector_.size());。它甚至存在吗? ***.com/questions/17036818/… 这是我从@DanielsaysreinstateMonica 获得转换功能(或缺少转换功能)的地方,是的,您指向我的信息来源。我用对了吗?这就是造成我的错误的原因。 问题是该问题的答案将参数传递给 constructor,但您传递给 function-call operatorcurrentStartMassVector_(...);currentStartMassVector_.operator()(...); 相同。您还应该检查使用Eigen::Map 的答案。 【参考方案1】:

您只能使用构造函数来初始化先前未声明的向量。 在这种情况下,特征向量已经在头文件中声明。

Eigen::Map()可用于将std::vector&lt;double&gt;的数据复制到Eigen::VectorXd,如下所示:

currentStartMassVector_ = Eigen::Map<Eigen::VectorXd>(StartMassVector_.data(),StartMassVector_.size()) ;

【讨论】:

以上是关于将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将数据从结构二进制复制到 std::vector

当C ++将元素从函数的返回值存储到std :: vector时出现意外的结果

将数据从 std::vector 传递到 std::valarray 的最有效方法

如何在不循环的情况下将数组的内容复制到 C++ 中的 std::vector?

将元素从 std::vector 复制到 std::stack c++

将 std::vector 分配给 std::valarray