计算对称(Hermite)矩阵规定范围内的特征值和特征向量(可选)。
C Interface:
ssyevx_(const char *jobz, const char *range, const char *uplo, const int *n, float *a, const int *lda, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, int *m, float *w, float *z,
const int *ldz, float *work, const int *lwork, int *iwork, int *ifail, int *info);
dsyevx_(const char *jobz, const char *range, const char *uplo, const int *n, double *a, const int *lda, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, int *m, double *w,
double *z, const int *ldz, double *work, const int *lwork, int *iwork, int *ifail, int *info);
cheevx_(const char *jobz, const char *range, const char *uplo, const int *n, kml_complex_float *a, const int *lda, const float *vl, const float *vu, const int *il, const int *iu, const float *abstol, int *m,
float *w, kml_complex_float *z, const int *ldz, kml_complex_float *work, const int *lwork, float *rwork, int *iwork, int *ifail, int *info);
zheevx_(const char *jobz, const char *range, const char *uplo, const int *n, kml_complex_double *a, const int *lda, const double *vl, const double *vu, const int *il, const int *iu, const double *abstol, int *m,
double *w, kml_complex_double *z, const int *ldz, kml_complex_double *work, const int *lwork, double *rwork, int *iwork, int *ifail, int *info);
Fortran Interface:
SSYEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO);
DSYEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO);
CSYEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO);
ZSYEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO);
参数 |
类型 |
说明 |
输入/输出 |
jobz |
字符型 |
|
输入 |
range |
字符型 |
|
输入 |
uplo |
字符型 |
|
输入 |
n |
整数型 |
矩阵A的维度 |
输入 |
a |
|
矩阵A |
输入/输出 |
lda |
整数型 |
矩阵A的主维 |
输入 |
vl |
|
|
输入 |
vu |
单精度/双精度浮点 |
|
输入 |
il |
整数型 |
|
输入 |
iu |
整数型 |
|
输入 |
abstol |
单精度/双精度浮点 |
特征值的绝对误差容忍度 |
输入 |
m |
整数型 |
需要计算的特征值个数,若range=A,m=n; 若range=I,m=iu-il+1 |
输出 |
w |
单/双精度浮点 |
一个长度为n的浮点数组数组,前m个存储了计算得到的m个特征值(升序排列) |
输出 |
z |
|
|
输出 |
ldz |
整数型 |
z的主维 |
输入 |
work |
|
临时存储空间,调用后work[0]为最优的lwork值。 |
输出 |
lwork |
整数型 |
work数组的长度。 当输入lwork=-1时查询最优work大小,结果保存在work[0]中,否则:
|
输入 |
rwork(复数类型特有) |
|
工作数组,用于临时存储数据,长度为7*n。 |
输出 |
iwork |
整数型 |
工作数组,用于临时存储数据,长度为5*n。 |
输出 |
ifail |
整数型 |
输出数组,指示哪些特征值未收敛。 |
输出 |
info |
整数型 |
状态值: 等于0:表示成功。 小于0:第-info个参数值不合法。 大于0:第info个特征值计算无法收敛。 |
输出 |
#include "klapack.h"
char jobz = 'V'; char range = 'A'; 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 vl = 0.0; double vu = 1.0; int il = 1; int iu = 2; double abstol = 1e-5; int m = 5; double w[5]; double z[25]; int ldz = 5; double work[40]; int lwork = 40; int iwork[25]; int ifail[5]; int info = 0; dsyevx_(&jobz, &range, &uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, lwork, iwork, ifail, &info); /* * Output: * Eigenvalues (in w) * -8.842215 -3.341090 1.188784 6.204987 25.106533 * Eigenvectors (in a) * 0.540506 -0.491256 0.488567 -0.240992 -0.412003 * -0.161613 0.597461 0.498950 -0.606212 0.021854 * -0.305939 0.243208 0.345443 0.583128 -0.622802 * 0.523491 0.488212 -0.521315 -0.103794 -0.452839 * -0.560440 -0.322810 -0.348211 -0.472883 -0.486653 */
Fortran Interface:
CHARACTER :: jobz = "V" CHARACTER :: range = "A" CHARACTER :: uplo = "L" PARAMETER (n = 5) PARAMETER (lda = 5) PARAMETER (ldz = 5) PARAMETER (lwork = 40) PARAMETER (m = 5) REAL(8) :: a(lda, n) REAL(8) :: vl = 0.0 REAL(8) :: vu = 1.0 INTEGER :: il = 1 INTEGER :: iu = 2 REAL(8) :: abstol = 1e-5 REAL(8) :: w(m) REAL(8) :: z(ldz, n) REAL(8) :: work(lwork) INTEGER :: iwork(5*n) 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 / EXTERNAL DSYEVX CALL DSYEVX(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info)