首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Armadillo:最小特征值的eigs_gen

Armadillo:最小特征值的eigs_gen
EN

Stack Overflow用户
提问于 2015-01-20 18:42:43
回答 2查看 1.1K关注 0票数 1

我是用armadillo的eigs_gen来求稀疏矩阵的最小代数特征值。

如果我只对最小的特征值请求函数,则结果是不正确的,但是如果我对2个最小的特征值请求它,则结果是正确的。守则是:

代码语言:javascript
运行
复制
#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;


int
main(int argc, char** argv)
  {
  cout << "Armadillo version: " << arma_version::as_string() << endl;

  sp_mat A(5,5);

  A(1,2) = -1;
  A(2,1) = -1;
  A(3,4) = -1;
  A(4,3) = -1;

  cx_vec eigval;
  cx_mat eigvec;

  eigs_gen(eigval, eigvec, A, 1, "sr");  // find smallest eigenvalue ---> INCORRECT RESULTS
  eigval.print("Smallest real eigval:");

  eigs_gen(eigval, eigvec, A, 2, "sr");  // find 2 smallest eigenvalues ---> ALMOST CORRECT RESULTS 
  eigval.print("Two smallest real eigvals:");

  return 0;
  }

我的编译命令是:

代码语言:javascript
运行
复制
 g++ file.cpp -o file.exe -O2 -I/path-to-armadillo/armadillo-4.600.3/include -DARMA_DONT_USE_WRAPPER -lblas -llapack -larpack

产出如下:

代码语言:javascript
运行
复制
Armadillo version: 4.600.3 (Off The Reservation)
Smallest real eigval:
    (+1.000e+00,+0.000e+00)
Two smallest real eigvals:
    (-1.000e+00,+0.000e+00)
    (-1.164e-17,+0.000e+00)

任何关于这种情况发生的原因以及如何克服这一问题的想法都是值得赞赏的。

注记:第二个结果几乎是正确的,因为我们期望-1,-1作为两个最低的特征值,但也许重复的特征值被忽略了。

Update:包括一个测试矩阵构造,在ryan更改后将"sa“选项包含到库中,似乎没有收敛:

代码语言:javascript
运行
复制
    #define ARMA_64BIT_WORD
    #include <armadillo>
    #include <iostream>
    #include <vector>
    #include <stdio.h>

    using namespace arma;
    using namespace std;

    int main(){

    size_t l(3), ls(l*l*l);
    sp_mat A = sprandn<sp_mat>(ls, ls, 0.01);
    sp_mat B = A.t()*A;

    vec eigval;
    mat eigvec;
    eigs_sym(eigval, eigvec, B, 1, "sa");

    return 0;

    }

感兴趣的矩阵大小要大得多,例如ls = 8000 - 27000,并不完全是这里构造的矩阵,但我认为问题应该是相同的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-27 15:00:09

我认为这里的问题是在对称矩阵上运行eigs_gen() (调用DNAUPD)。ARPACK指出,DNAUPD不是针对对称矩阵的,但没有指定如果您使用对称矩阵会发生什么:

注:对于实半正定对称矩阵B,即B*OP = (OP')*B,如果线性算子OP是实的对称的,则应使用子例程ssaupd。

(来自http://www.mathkeisan.com/usersguide/man/dnaupd.html )

我修改了内部Armadillo代码,将"sa“(最小代数)传递给eigs_sym() (sp_auxlib_meat.hpp)中的ARPACK调用,并获得了正确的特征值。我已经向上游提交了一个补丁,以便为eigs_sym()提供"sa“和"la”支持,我认为一旦发布了一个新版本(或者在将来的某个时候),它应该可以解决您的问题。

票数 3
EN

Stack Overflow用户

发布于 2015-01-21 10:40:07

问题是重复的特征值;如果我将前两个矩阵元改为

代码语言:javascript
运行
复制
A(1,2) = -1.00000001;
A(2,1) = -1.00000001;

取得了预期的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28052845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档