Как преобразовать Eigen :: eigenvector (). Col (0) .real () в стандартный вектор? - PullRequest
1 голос
/ 05 апреля 2019

Я работаю над кодом на c ++, который вычисляет собственные векторы матрицы с использованием библиотеки Eigen.Мне нужен только первый столбец и только реальные значения собственного вектора.Есть ли способ скопировать эти значения в тип данных std::vector?Может кто-нибудь помочь мне с этим?

Я видел это Преобразование Eigen :: MatrixXf в 2D std :: vector post.Но мне нужны только конкретные значения.Более того, я не уверен, какой тип возвращает функция eigenvector().В документации это сказано как сложный Eigen::Matrix тип.

Это пример кода.

#include<iostream>
#include<Eigen/Eigenvalues>
#include<vector>
using namespace std;

struct eigen
{
    float a, b, c;
};

int main()
{
    vector<Eigen::Matrix3f> A(1);
    A[0] << 1, 2, 3, 2, 4, 5, 3, 5, 6;
    Eigen::EigenSolver<Eigen::Matrix3f> handle(A[0]);
    cout << "The matrix of eigenvectors, V, is: " << endl << handle.eigenvectors() << endl << endl;
    cout << "The real part of first column is : " << endl << 
    handle.eigenvectors().col(0).real() << endl << endl;
    return 0;
}

Вывод приведенного выше кода

The matrix of eigenvectors, V, is:
 (0.327985,0) (-0.736977,0) (-0.591009,0)
 (0.591009,0) (-0.327985,0)  (0.736976,0)
 (0.736976,0)  (0.591009,0) (-0.327985,0)

The real part of the first column is :
0.327985
0.591009
0.736976

Мне нужно скопировать значения handle.eigenvectors().col(0).real() в std::vector<eigen>

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вы можете добавить конструктор и / или оператор присваивания к eigen, который копирует значения.

struct eigen
{
    eigen() = default;
    template <typename InputIterator, typename = std::iterator_traits<InputIterator>::value_type>
    eigen(InputIterator first) : a(*first++), b(*first++), c(*first++) {}
    template <typename InputIterator, typename = std::iterator_traits<InputIterator>::value_type>
    eigen& operator=(InputIterator first)
    {
        a = *first++;
        b = *first++;
        c = *first++;
        return *this;
    }
    float a, b, c;
};

int main()
{
    Eigen::Matrix3f A;
    A << 1, 2, 3, 2, 4, 5, 3, 5, 6;
    Eigen::EigenSolver<Eigen::Matrix3f> handle(A);
    std::cout << "The matrix of eigenvectors, V, is: " << std::endl << handle.eigenvectors() << std::endl << std::endl;
    std::cout << "The real part of first column is : " << std::endl << 
    handle.eigenvectors().col(0).real() << std::endl << std::endl;

    eigen e = handle.eigenvectors().col(0).real();

    return 0;
}
1 голос
/ 05 апреля 2019

Карта ответ:

 Vector3f::Map(&v[0].a) = handle.eigenvectors().col(0).real();
...