【问题标题】:Eigenvalue computation by STEVDSTEVE的特征值计算
【发布时间】:2014-07-17 11:42:38
【问题描述】:

我有一个对称的三对角矩阵,我想计算它的特征值和特征向量。我正在使用 LAPACK dstevd 函数来执行此操作。我正在用 C 编码,所以我在代码顶部有以下行,所以我可以调用 fortran 函数:

extern "C" void dstevd_( char *jobz, int N, double d, double* e, double *z, int *ldz, int *work, int *lwork, int *iwork , int *liwork, int *info);

我需要特征向量,所以我需要设置 *z、*work 和 *iwork。根据 LAPACK 手册(Link),尺寸需要为: z:>= n*n,工作:>= 1 + 4*n + n**2,iwork:>= 3 + 5*n。

使用这些大小时,我收到错误消息说 dstevd_ 正在访问未在这些数组中分配的内存。它适用于小(n = 4)问题,但我遇到更大尺寸(n = 36)的问题。如果我增加 z 的大小,work 和 iwork 就可以了。

关于如何正确确定 z、work 和 iwork 所需尺寸的任何建议?

谢谢。

【问题讨论】:

    标签: c lapack eigenvector eigenvalue


    【解决方案1】:

    嗯,您的原型与 Fortran 原型不匹配,这会导致各种问题。

    • N 应该作为指针传递,而不是标量。
    • d 是一个数组,而不是一个标量。
    • work 是双精度类型,而不是 int。

    为了避免这些问题,为什么不使用 LAPACK C 接口,它是自 2010 年 3.3.0 以来 LAPACK 的一部分。在你的情况下,那将是 LAPACKE_dstevd。有关使用 LAPACKE 的更多信息,请参阅http://www.netlib.org/lapack/lapacke

    【讨论】:

    • 谢谢。不知何故,将原型复制到stackoverflow时*消失了。但我错过了双精度工作。这似乎做到了。有趣的是它仍在解决其他问题。但是,如果您知道问题所在,那就有点道理了……
    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多