2015-01-20 168 views
0

我使用armadillo的eigs_gen来查找稀疏矩阵的最小代数特征值。Armadillo:eigs_gen最小特征值

如果我只是要求最小特征值的函数,结果是不正确的,但是如果我要求它为2个最小的特征值,结果是正确的。该代码是:

#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; 
    } 

我的编译命令是:

g++ file.cpp -o file.exe -O2 -I/path-to-armadillo/armadillo-4.600.3/include -DARMA_DONT_USE_WRAPPER -lblas -llapack -larpack 

输出是:

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作为两个最低的特征值,但可能重复的特征值被忽略。

更新:包括测试矩阵结构,它之后,瑞安的变化包括“SA”选项库,似乎并没有收敛:

#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,并不完全是这里构建的矩阵,但我认为问题应该是相同的。

回答

2

我相信这里的问题是您在对称矩阵上运行eigs_gen()(它调用DNAUPD)。 ARPACK指出,DNAUPD并不意味着对称矩阵,但不指定,如果你使用对称矩阵反正会发生什么:

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

(从http://www.mathkeisan.com/usersguide/man/dnaupd.html

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

+0

谢谢,这实际上是图书馆非常希望和实质性的改进。 – MaviPranav 2015-02-18 14:18:42

+0

实际上似乎存在“sa”选项的收敛问题,缺少“lm”选项。我已经包含了代码的更新,显示了一个测试矩阵结构,这似乎并不适合我。 – MaviPranav 2015-02-20 17:31:42

+0

我建议这里的问题不是Armadillo的ARPACK包装,而是ARPACK使用的数值方法。对输入矩阵的属性进行更好的调查,以及隐式重新启动的Arnoldi方法是否适合您的特定矩阵,可能是接下来要做的事情。 – ryan 2015-02-23 22:42:35

0

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

A(1,2) = -1.00000001; 
A(2,1) = -1.00000001; 

获得预期结果。