【问题标题】:Armadillo: eigs_gen can not successfully give answer犰狳:eigs_gen 无法成功给出答案
【发布时间】:2015-10-23 05:54:13
【问题描述】:

我用犰狳的eigs_gen求一个稀疏矩阵的最小代数特征值,但是eigs_gen不能给出答案。我测试了眼睛矩阵 6*6 的 eigs_gen,它也不能给出答案。代码是:

#include <iostream>
#include <armadillo>
using namespace arma;
using namespace std;
int main(int argc, char** argv)
{
    cout << "Armadillo version: " << arma_version::as_string() << endl;
    sp_mat A = speye<sp_mat>(6, 6);
    A.print("A:");

    cx_vec eigval;
    cx_mat eigvec;

    eigs_gen(eigval, eigvec, A, 1, "sm", 1);  // find 1 eigenvalues/eigenvectors
    eigval.print("eigval:");
    return 0;
}   

答案是:

Armadillo version: 6.100.0 (Midnight Blue)
A:
[matrix size: 6x6; n_nonzero: 6; density: 16.67%]

     (0, 0)         1.0000
     (1, 1)         1.0000
     (2, 2)         1.0000
     (3, 3)         1.0000
     (4, 4)         1.0000
     (5, 5)         1.0000

*** Error in `./test': double free or corruption (out): 0x00007fff38dd6910 ***
Aborted (core dumped)

但是,当眼睛矩阵为 5*5 时,可以得到正确答案。
代码是:

#include <iostream>
#include <armadillo>
using namespace arma;
using namespace std;
int main(int argc, char** argv)
{
    cout << "Armadillo version: " << arma_version::as_string() << endl;
    sp_mat A = speye<sp_mat>(5, 5);
    A.print("A:");

    cx_vec eigval;
    cx_mat eigvec;

    eigs_gen(eigval, eigvec, A, 1, "sm", 1);  // find 1 eigenvalues/eigenvectors
    eigval.print("eigval:");
    return 0;
}  

答案是:

Armadillo version: 6.100.0 (Midnight Blue)
A:
[matrix size: 5x5; n_nonzero: 5; density: 20.00%]

     (0, 0)         1.0000
     (1, 1)         1.0000
     (2, 2)         1.0000
     (3, 3)         1.000
     (4, 4)         1.0000

eigval:
    (+1.000e+00,+0.000e+00)

我的编译命令是:

g++ test.cpp -o test -O2 -I/usr/local/include/armadillo -L/usr/local/lib -DARMA_DONT_USE_WRAPPER -larpack -llapack -lblas -lf2c -lgfortran

我正在开发 ubuntu 14.04LTS。

【问题讨论】:

  • 对我来说很好。 valgrind 怎么说?
  • @hbrerkere 嗨,valgrind 说“arpack”包的功能有问题。函数有pow_di、dlamc2_、dlamch_等。我想这可能与我的“arpack”有关。你能告诉我为什么会这样吗?谢谢。 valgrind 所说的如下: ==7735== 条件跳转或移动取决于未初始化的值 ==7735== 在 0x43366B:pow_di ... ==7735== 由 0x408A9E:void arma::arpack::naupd (int*, char*, int*, char*, int*, double*, double*, int*, double*, int*, int*, int*, double*, double*, int* , double*, int*) (arpack_wrapper.hpp:33)。

标签: sparse-matrix armadillo eigenvalue


【解决方案1】:

我已经找到了解决这个问题的方法。原因是libopenblas、liblapack、libarpack是我自己编译的,都打包成静态库了。当它们一起使用时,就出现了这个问题。 解决方案是通过下面列出的命令安装这些包。 sudo apt-get install libopenblas-dev sudo apt-get install liblapack-dev sudo apt-get install libarpack2-dev

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多