在C ++中为大密集矩阵计算k个最大特征值和特征向量的最简单,最快的方法(当然还有一些库)是什么?我正在寻找相当于MATLAB的eigs
函数;我查看了Armadillo和Eigen但找不到一个,计算所有特征值在我的情况下永远(我需要前10个特征向量用于大约30000x30000密集的非对称实矩阵)。
绝望,我甚至尝试用犰狳的QR分解自己实现功率迭代,但遇到了复杂的特征值对并放弃了。 :)
答案 0 :(得分:1)
AFAIK找到通用矩阵的第一个k
特征值的问题没有简单的解决方案。您提到的Matlab函数eigs
应该与稀疏矩阵一起使用。
Matlab可能会使用Arnoldi / Lanczos,即使你的矩阵不稀疏,你也可以试试它是否适合你的情况。 Arnlodi的参考包是ARPACK,它有一个C ++接口。
答案 1 :(得分:1)
你试过https://github.com/yixuan/spectra吗? 它类似于ARPACK但具有很好的类似Eigen的接口(它与Eigen兼容!)
我将它用于30kx30k矩阵(PCA)并且它非常好
答案 2 :(得分:0)
Eigen有一个EigenValues模块可以很好地工作..但是,我从来没有在那么大的任何东西上使用它。
答案 3 :(得分:0)
这是我在C++ Eigen中获得NxN个实值(浮点),密集,对称矩阵A的k个最大特征向量的方法:
#include <Eigen/Dense>
...
Eigen::MatrixXf A(N,N);
...
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> solver(N);
solver.compute(A);
Eigen::VectorXf lambda = solver.eigenvalues().reverse();
Eigen::MatrixXf X = solver.eigenvectors().block(0,N-k,N,k).rowwise().reverse();
请注意,特征值和相关的特征向量以升序返回,因此我将它们反转以首先获得最大值。
如果您想要其他(非对称)矩阵的特征值和特征向量,它们通常会很复杂,您将需要使用Eigen::EigenSolver
类。