将Eigen::VectorXd转换为std::vector<double>

3
如标题所述,我试图将Eigen :: VectorXd转换为std :: vector。向量是通过对矩阵进行对角化然后取过程的第一个特征向量获得的。
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

using namespace std;

int main()
{
    vector<double> vec;
    MatrixXd ones = MatrixXd::Ones(3,3);
    VectorXd firstEvector;
    SelfAdjointEigenSolver<MatrixXd> es(ones);
    firstEvector = es.eigenvectors().col(1);
    cout << "The first eigenvector of the 3x3 matrix of ones is:" << endl << firstEvector << endl;
    vec(&firstEvector[0], firstEvector.data() + firstEvector.cols()*firstEvector.rows());
    return 0;
}

我之前认为这是正确的方法,但实际上它并不起作用。我收到了以下错误信息。
C:\CBProjects\eigenVectors\main.cpp|20|error: no match for call to '(std::vector<double>) (Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1>, 1>::Scalar*, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1> >::Scalar*)'|

我不知道自己做错了什么,希望能得到帮助,非常感激。

1个回答

5

您正在使用构造函数语法来声明已经声明的std::vector vec,这是不起作用的。

将一个Eigen::VectorXd的内容复制到std::vector<double>有两种有效的可能性。您可以像这样构造一个新的std::vector vec2

vector<double> vec2(firstEvector.data(), firstEvector.data() + firstEvector.size());

您可以使用先前声明的向量vec并通过使用Eigen::MapEigen::VectorXd传输数据。但在这种情况下,需要首先调整std::vector的大小:

vec.resize(firstEvector.size());
Map<VectorXd>(vec.data(), vec.size()) = firstEvector;

谢谢。这正是我正在寻找的。 - Christian Farina
1
哇,这真的很有帮助!不确定为什么它没有更多的赞! - Manumerous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接