LAPACKE_cheev仅返回特征向量的上矩阵

问题描述 投票:1回答:1

我需要通过使用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不会存储整个特征向量矩阵-仅存储上半部分。关于上面的链接,这应该是正确的语法,等等。

我想念什么吗?我非常感谢您提供提示。

lapack eigenvalue lapacke
1个回答
0
投票

是的,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.clapacke_zheev_work.c

例程lapacke_zheevd_work.clapacke_zheevd_work.c正确使用lapacke_zheevr_work.c

lapacke_zheevr_work.c

lapacke_zheevx_work.c处提供的示例也可能受此问题困扰,因为它也使用了lapacke_zheevx_work.c,这确实需要换位。

© www.soinside.com 2019 - 2024. All rights reserved.