在Eigen3中,是否有一种寻找实的、对称的、非常大的,例如10000x10000稀疏矩阵的特征值和特征向量的方法?对于稠密矩阵有一个特征值求解器,但这没有利用矩阵的性质,例如它的对称性。此外,我也不想把矩阵存储在稠密的地方。
或者(替代)是否有一个更好的(++更好的文档)库来做到这一点?
发布于 2015-05-12 02:55:13
发布于 2018-02-10 09:18:08
对于艾根来说,有一个名为光谱的图书馆。正如在其网页上所描述的,Spectra是使用C++语言重新设计ARPACK库的。
与另一个答案中提出的Armadillo不同,Spectra确实支持long double
和其他任何真正的浮点类型(例如boost::multiprecision::float128
)。
下面是一个用法示例(与文档中的版本相同,但适用于不同浮点类型的实验):
#include <Eigen/Core>
#include <SymEigsSolver.h> // Also includes <MatOp/DenseSymMatProd.h>
#include <iostream>
#include <limits>
int main()
{
using Real=long double;
using Matrix=Eigen::Matrix<Real, Eigen::Dynamic, Eigen::Dynamic>;
// We are going to calculate the eigenvalues of M
const auto A = Matrix::Random(10, 10);
const Matrix M = A + A.transpose();
// Construct matrix operation object using the wrapper class DenseGenMatProd
Spectra::DenseSymMatProd<Real> op(M);
// Construct eigen solver object, requesting the largest three eigenvalues
Spectra::SymEigsSolver<Real,
Spectra::LARGEST_ALGE,
Spectra::DenseSymMatProd<Real>> eigs(&op, 3, 6);
// Initialize and compute
eigs.init();
const auto nconv = eigs.compute();
std::cout << nconv << " eigenvalues converged.\n";
// Retrieve results
if(eigs.info() == Spectra::SUCCESSFUL)
{
const auto evalues = eigs.eigenvalues();
std::cout.precision(std::numeric_limits<Real>::digits10);
std::cout << "Eigenvalues found:\n" << evalues << '\n';
}
}
https://stackoverflow.com/questions/30188482
复制相似问题