---
title: ?sy(he)evx
description: "计算对称（Hermite）矩阵规定范围内的特征值和特征向量（可选）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0758.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0758.html
indexId: 4eee1c28ba0cf6915eedc193d82d97a8a543e1bb61a106f4fab6a5a5edb6a3bf61
---
# ?sy(he)evx

计算对称（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);

CHEEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO);

ZHEEVX(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO);


#### 参数

| 参数 | 类型 | 说明 | 输入/输出 |
| --- | --- | --- | --- |
| jobz | 字符型 | N：只计算特征值； V：计算特征值和特征向量 | 输入 |
| range | 字符型 | A：计算所有特征值； V：在(vl, vu]范围内的特征值； I：第il和iu个特征值会被计算 | 输入 |
| uplo | 字符型 | U：矩阵A的上三角部分被存储； L：矩阵A的下三角部分被存储 | 输入 |
| n | 整数型 | 矩阵A的维度 | 输入 |
| a | 在ssyevx中为单精度浮点型数组。 在dsyevx中为双精度浮点型数组。 在cheevx中为单精度复数型数组。 在zheevx中为双精度复数型数组。 | 矩阵A | 输入/输出 |
| lda | 整数型 | 矩阵A的主维 | 输入 |
| vl | 在ssyevx/cheevx中为单精度浮点型数。 在dsyevx/zheevx中为双精度浮点型数。 | 当range=V时，表示获取特征值的下界； 当range=A或I时参数无效 | 输入 |
| vu | 单精度/双精度浮点 | 当range=V时，表示获取特征值的上界； 当range=A或I时参数无效 | 输入 |
| il | 整数型 | 当range=I时，表示会返回第il个特征值； 当range=A或V时，参数无效 | 输入 |
| iu | 整数型 | 当range=I时，表示会返回第iu个特征值； 当range=A或V时，参数无效 | 输入 |
| abstol | 单精度/双精度浮点 | 特征值的绝对误差容忍度 | 输入 |
| m | 整数型 | 需要计算的特征值个数，若range=A，m=n； 若range=I，m=iu\-il+1 | 输出 |
| w | 单/双精度浮点 | 一个长度为n的浮点数组，前m个存储了计算得到的m个特征值（升序排列） | 输出 |
| z | 在ssyevx中为单精度浮点型数组。 在dsyevx中为双精度浮点型数组。 在cheevx中为单精度复数型数组。 在zheevx中为双精度复数型数组。 | 若jobz=V, 且info=0,前m列存储了对应的特征向量 若jobz=N，则此参数无效 | 输出 |
| ldz | 整数型 | z的主维 | 输入 |
| work | 在ssyevx中为单精度浮点型数组。 在dsyevx中为双精度浮点型数组。 在cheevx中为单精度复数型数组。 在zheevx中为双精度复数型数组。 | 临时存储空间，调用后work[0]为最优的lwork值。 | 输出 |
| lwork | 整数型 | work数组的长度。 当输入lwork=\-1时查询最优work大小，结果保存在work[0]中，否则： 当n ≤ 1时，lwork ≥ 1。 当n > 1时，ssyevx与dsyevx中lwork ≥ 8\*n；cheevx与zheevx中lwork ≥ 2\*n。 | 输入 |
| rwork（复数类型特有） | 在cheevx中为单精度浮点型数组。 在zheevx中为双精度浮点型数组。 | 工作数组，用于临时存储数据，长度为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)
```
