2014-07-17 188 views
1

我有一个对称的三对角矩阵,我想要计算特征值和特征向量。我正在使用LAPACK dstevd功能来做到这一点。我用C语言编写代码,所以我在代码顶部有以下行,因此我可以调用fortran函数:特征值计算由STEVD

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,*工作和* iwork。根据LAPACK手册(Link),尺寸需要为: z:> = n * n,工作:> = 1 + 4 * n + n ** 2,iwork:> = 3 + 5 * n。

使用这些尺寸时,我收到错误,表示dstevd_正在访问未在这些阵列中分配的内存。它适用于小型(n = 4)问题,但我遇到更大尺寸问题(n = 36)。如果我增加z的大小,工作和iwork它的作品。

关于如何正确确定z,工作和iwork所需尺寸的任何建议?

谢谢。

回答

1

那么,你的原型与Fortran原型不匹配,会导致各种问题。

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

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

+0

谢谢。不知何故,当将原型复制到stackoverflow时*消失了。但我错过了双精度工作。这似乎做到了。有趣的是,它仍然在为其他问题工作。但是,如果你知道这个问题,那有道理...... – user3430219