使用eigen3/稀疏的稀疏特征值
Sparse eigenvalues using eigen3/sparse
是否有一种独特而有效的方法来查找真实,对称,非常大的特征值和特征向量,例如1000000x10000, eigen33 的稀疏矩阵?有一个用于密集矩阵的特征值求解器,但这并不能使用矩阵的属性,例如这是对称的。此外,我不想将矩阵存储在密集中。
或(替代)是否有更好的( 更好的记录)库可以做到这一点?
对于特征,有一个名为Spectra的库。如其网页上所述,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';
}
}
Armadillo将使用eigs_sym
请注意,计算所有 eigenvalues是一个非常昂贵的操作,无论您做什么,通常要做的就是仅找到最大或最小的特征值(这就是这样做的)。<<<<<<<<<<<<<<<</p>
相关文章:
- CLion 无法在 macOS 上找到 Eigen3
- 计算数组的特征值/向量,而不是使用特征 3 计算矩阵
- 在 Eigen3 中实现 Bartels-Stewart 算法 -- 仅实矩阵?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 如何删除 Eigen3 矩阵中某些不连续的行和列?
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- c++ Eigen3 矩阵奇怪的行为
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
- C++ 查找矩阵的特征值和特征向量
- Python numpy 代码比 eigen3 或普通C++更高效
- 如何在ubuntu下使用eigen3的cholmodsupport
- 使用 MKL 编译 Eigen3
- 使用python在非阳性组件中使用python与cpp中的特征库来计算特征值
- 计算本特征值的错误
- 从eigen3矩阵中获取唯一的值
- 自定义一元/二进制Expr() eigen3 的参数
- 使用eigen3的稀疏基质的特征值
- 使用eigen3/稀疏的稀疏特征值
- 访问eigen3中的特征值