【问题标题】:Finding eigenvalues and eigenvectors of a large (sparse) matrix查找大型(稀疏)矩阵的特征值和特征向量
【发布时间】:2014-07-05 19:16:37
【问题描述】:

我正在尝试计算一个大矩阵的特征向量(比如前 10 个)。我最初的问题是由于对英特尔 MKL 库的误解造成的。为了使我的问题清晰易懂,我决定对其进行概括并删除一些不必要的细节。

基本问题是:应该使用哪种计算机代码来查找大型稀疏矩阵的特征值?

在某些近似下,我的矩阵可以被认为是稀疏的。即,当远离对角线时,值变得非常小。其中一些甚至是非物理的,由统计效应引起(矩阵由 MC 代码生成)。这就是为什么术语稀疏放在括号中的原因。

如果有人可以提供代码示例,我将不胜感激。

提前谢谢你,

亚历克斯

【问题讨论】:

  • 英特尔没有在他们的文档中提供代码示例吗?除非您可以向 SO 展示您所做的事情,最好是使用代码,否则对于您遇到的 programming 问题非常具体,您不太可能在这里获得太多帮助。您甚至可能会投下反对票,而您的问题可能会吸引接近投票。
  • 此例程称为DGEEV(如果使用双精度)。以下是示例:software.intel.com/sites/products/documentation/doclib/mkl_sa/…
  • 您好弗朗西斯,感谢您的回复。这正是我所需要的,但事实证明我需要稀疏存储。使用密集存储时,我拥有的矩阵太大而无法放入内存。
  • 嗨,我一直在试验特征值例程。不幸的是,除了 MKL,我真的无法让它们运行。这些手册是真正的废话,不清楚应该做什么。 ARPACK 是这方面最生动的例子。我尝试自己编写一些算法。不幸的是,我无法得到我需要的东西。

标签: matrix lapack eigenvector eigenvalue intel-mkl


【解决方案1】:

ARPACK 可能是 正确 使用的东西。这是旧的 fortran 代码,安装起来很麻烦(尽管维护的 arpack-ng 可能更好)。

或者,libiglEigen 之上构建了一个粗略的幂迭代实现。您可以像使用 MATLAB 的 eigs 一样使用 libigl 版本:

Eigen::SparseMatrix<double> A;
Eigen::SparseMatrix<double> B;
...
Eigen::MatrixXd V;
Eigen::VectorXd D;
igl::eigs(A,B,3,igl::EIGS_TYPE_SM,V,D);

这将计算V 列中的特征向量和D 中三个最小特征值的特征值。

【讨论】:

    猜你喜欢
    • 2017-10-21
    • 2015-11-28
    • 2019-01-27
    • 2013-09-25
    • 2011-03-18
    • 2019-04-29
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多