с ++ найти собственные значения и собственные векторы матрицы - PullRequest
0 голосов
/ 22 мая 2018

Я пишу алгоритм с большим количеством шагов (PCA), и два из них находят собственные значения и собственные векторы данной матрицы.

Я не хочу писать весь код для него, потому чтоЯ знаю, что это долгая работа, поэтому я искал некоторый adhoc-код для этого, но только нашел 1 или 2 библиотеки, и сначала я предпочитаю не включать библиотеки и не хочу переходить на matlab.

Есть ли какой-нибудь алгоритм / учебное пособие / код, который не кажется очень сложным для следования?

1 Ответ

0 голосов
/ 06 июня 2019

Если кому-то это нужно, вот как я это сделал

    Eigen::EigenSolver<Eigen::MatrixXf> eigensolver;
    eigensolver.compute(covmat);
    Eigen::VectorXf eigen_values = eigensolver.eigenvalues().real();
    Eigen::MatrixXf eigen_vectors = eigensolver.eigenvectors().real();
    std::vector<std::tuple<float, Eigen::VectorXf>> eigen_vectors_and_values; 

    for(int i=0; i<eigen_values.size(); i++){
        std::tuple<float, Eigen::VectorXf> vec_and_val(eigen_values[i], eigen_vectors.row(i));
        eigen_vectors_and_values.push_back(vec_and_val);
    }
    std::sort(eigen_vectors_and_values.begin(), eigen_vectors_and_values.end(), 
        [&](const std::tuple<float, Eigen::VectorXf>& a, const std::tuple<float, Eigen::VectorXf>& b) -> bool{ 
            return std::get<0>(a) <= std::get<0>(b); 
    });
    int index = 0;
    for(auto const vect : eigen_vectors_and_values){
        eigen_values(index) = std::get<0>(vect);
        eigen_vectors.row(index) = std::get<1>(vect);
        index++;
    }

Здесь covmat , в котором нужно найти собственные векторы и собственные значения.Кроме того, я сортирую их в порядке убывания, который мы делаем большую часть времени.Одна важная вещь заключается в том, что при выборе того, какую методику собственного разложения следует использовать, будьте осторожны, потому что они не работают одинаково.Вы можете узнать больше информации здесь [https://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...