计算广义特征值问题的所有特征值和特征向量(可选)。
矩阵A,B为对称(Hermitian)矩阵,同时B为正定矩阵。
C Interface:
dsygv_(const int *itype, const char *jobz, const char *uplo, const int *n, double *a, const int *lda, double *b, const int *ldb, double *w, double *work, const int *lwork, int *info);
ssygv_(const int *itype, const char *jobz, const char *uplo, const int *n, float *a, const int *lda, float *b, const int *ldb, float *w, float *work, const int *lwork, int *info);
chegv_(const int *itype, const char *jobz, const char *uplo, const int *n, kml_complex_float *a, const int *lda, kml_complex_float *b, const int *ldb, float *w, kml_complex_float *work, const int *lwork,
float *rwork, int *info);
zhegv_(const int *itype, const char *jobz, const char *uplo, const int *n, kml_complex_double *a, const int *lda, kml_complex_double *b, const int *ldb, double *w, kml_complex_double *work, const int *lwork,
double *rwork, int *info);
Fortran Interface:
DSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO);
SSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO);
CSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);
ZSYGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);
参数 |
类型 |
说明 |
输入/输出 |
itype |
整数型 |
求解问题类型
|
输入 |
jobz |
字符型 |
|
输入 |
uplo |
字符型 |
|
输入 |
n |
整数型 |
矩阵A和B的维度 |
输入 |
a |
|
矩阵A |
输入/输出 |
lda |
整数型 |
矩阵A的主维 |
输入 |
b |
|
矩阵B |
输入/输出 |
ldb |
整数型 |
矩阵B的主维 |
输入 |
w |
单/双精度 |
长度为n的数组,存储得到特征值(升序排列) |
输出 |
work |
单/双精度 |
若info=0,work(0)返回最佳lwork |
输出 |
lwork |
整数型 |
work数组的长度。 lwork ≥ max(1, 2*n-1)。 |
输入 |
rwork(复数类型特有) |
|
工作数组,用于临时存储数据。 |
输出 |
info |
整数型 |
状态值: 等于0:表示成功。 小于0:第-info个参数值不合法。 大于0:算法出错。 |
输出 |
#include "klapack.h"
int itype = 1; char jobz = 'V'; char uplo = 'L'; int n = 5; double a[] = {7.027, 8.710, 1.015, 6.929, 7.584, 8.710, 0.839, 2.469, 3.850, 0.559, 1.015, 2.469, 1.930, 6.761, 7.207, 6.929, 3.850, 6.761, 4.344, 4.804, 7.584, 0.559, 7.207, 4.804, 6.177}; int lda = 5; double b[] = {2.345678,1.234567,0.987654,1.456789,0.876543, 1.234567,2.345678,1.123456,0.987654,1.234567, 0.987654,1.123456,2.345678,1.234567,0.987654, 1.456789,0.987654,1.234567,2.345678,1.123456, 0.876543,1.234567,0.987654,1.123456,2.345678}; int ldb = 5; double w[5]; double work[15]; int lwork = 15; int info = 0; dsygv_(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, &info); /* * Output: * Eigenvalues (in w) * -8.726204 -2.319727 1.043130 4.411714 4.668052 * Eigenvectors (in a) * 0.604055 -0.456650 0.512079 -0.505769 -0.177986 * 0.174314 -0.523003 -0.357093 0.517106 -0.028092 * -0.277558 0.232180 0.310527 0.581010 -0.538289 * 0.541974 0.126215 -0.182883 -0.010722 0.210494 * -0.205335 -0.456850 0.389506 0.070554 0.553286 */
Fortran Interface:
INTEGER :: itype = 1 CHARACTER :: jobz = "V" CHARACTER :: uplo = "L" PARAMETER (n = 5) PARAMETER (lda = 5) PARAMETER (ldb = 5) PARAMETER (lwork = 15) REAL(8) :: a(lda, n) REAL(8) :: w(n) REAL(8) :: work(lwork) INTEGER :: info = 0 DATA a / 7.027, 8.710, 1.015, 6.929, 7.584, 8.710, 0.839, 2.469, 3.850, 0.559, 1.015, 2.469, 1.930, 6.761, 7.207, 6.929, 3.850, 6.761, 4.344, 4.804, 7.584, 0.559, 7.207, 4.804, 6.177 / DATA b / 2.345678,1.234567,0.987654,1.456789,0.876543, 1.234567,2.345678,1.123456,0.987654,1.234567, 0.987654,1.123456,2.345678,1.234567,0.987654, 1.456789,0.987654,1.234567,2.345678,1.123456, 0.876543,1.234567,0.987654,1.123456,2.345678 / EXTERNAL DSYGV CALL DSYGV(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info)