我需要通过使用LAPACKE计算复杂的埃尔米特矩阵的特征值/特征向量。我找到了函数LAPACKE_cheev。它可以正确计算特征值。但是,它仅存储特征向量的上矩阵。我遵循以下示例代码:[https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapacke_cheev_row.c.htm]
我的代码基本相同:
lapack_complex_float *eigenvectors = (lapack_complex_float*) malloc(num_receivers*num_receivers* sizeof(lapack_complex_float));
//copies upper matrix 'R' into complex matrix 'eigenvalues'
info= LAPACKE_clacpy(LAPACK_ROW_MAJOR,'U', num_receivers,num_receivers,R,num_receivers,eigenvectors,num_receivers);
int n = num_receivers;
int lda =n;
float w[n];
info = LAPACKE_cheev(LAPACK_ROW_MAJOR, 'V', 'U', n, eigenvectors, lda, w);
矩阵特征向量只是存储矩阵R的上半部分-这很好。但是,cheev不会存储整个特征向量矩阵-仅存储上半部分。关于上面的链接,这应该是正确的语法,等等。
我想念什么吗?我非常感谢您提供提示。
是的,LAPACKE的lapacke_cheev_work.c
中有一个错误,在线:
/* Transpose output matrices */
LAPACKE_che_trans( LAPACK_COL_MAJOR, uplo, n, a_t, lda_t, a, lda );
实际上,LAPACKE_che_trans()
设计为转置Hermitian矩阵,并根据uplo
利用它们的上半部分或下半部分。但是,cheev('V', ... )
的输出是由输入矩阵的正交特征向量构成的矩阵。
[与其他与特征值相关的例程也出现此问题,例如lapacke_zheev_work.c
,lapacke_zheev_work.c
例程lapacke_zheevd_work.c
和lapacke_zheevd_work.c
正确使用lapacke_zheevr_work.c
:
lapacke_zheevr_work.c
lapacke_zheevx_work.c
处提供的示例也可能受此问题困扰,因为它也使用了lapacke_zheevx_work.c
,这确实需要换位。