2014-07-17 241 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