c ++找到矩阵的特征值和特征向量

时间:2018-05-22 01:51:49

标签: c++ matrix eigenvalue eigenvector

我正在编写一个包含很多步骤(PCA)的算法,其中两个是找到给定矩阵的特征值和特征向量。

我不想为它编写完整的代码因为我知道它是一个很长的工作,所以我搜索了一些特殊代码,但只找到了1或2个库,起初我不想包含库和我我不想转向matlab。

是否有任何算法/教程/代码似乎很难遵循?

1 个答案:

答案 0 :(得分:0)

如果有人需要,这是我的做法

    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]

中找到更多信息。