---
title: ?sy(he)gv
description: "计算广义特征值问题的所有特征值和特征向量（可选）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0759.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0759.html
indexId: 6c19a4d6bcdd951d4679b41a5d3836f0ffedea1fbffe73701e02b1c1aac798cf61
---
# ?sy(he)gv

计算广义特征值问题的所有特征值和特征向量（可选）。

矩阵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);

CHEGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);

ZHEGV(ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, RWORK, INFO);


#### 参数

| 参数 | 类型 | 说明 | 输入/输出 |
| --- | --- | --- | --- |
| itype | 整数型 | 求解问题类型 1：A\*x=lambda\*B\*x 2：A\*B\*x = (lambda)\*x 3：B\*A\*x = (lambda)\*x | 输入 |
| jobz | 字符型 | N：只计算特征值； V：计算特征值和特征向量 | 输入 |
| uplo | 字符型 | U：矩阵A的上三角部分被存储； L：矩阵A的下三角部分被存储 | 输入 |
| n | 整数型 | 矩阵A和B的维度 | 输入 |
| a | 在ssygv中为单精度浮点型数组。 在dsygv中为双精度浮点型数组。 在chegv中为单精度复数型数组。 在zhegv中为双精度复数型数组。 | 矩阵A | 输入/输出 |
| lda | 整数型 | 矩阵A的主维 | 输入 |
| b | 在ssygv中为单精度浮点型数组。 在dsygv中为双精度浮点型数组。 在chegv中为单精度复数型数组。 在zhegv中为双精度复数型数组。 | 矩阵B | 输入/输出 |
| ldb | 整数型 | 矩阵B的主维 | 输入 |
| w | 单/双精度 | 长度为n的数组，存储得到特征值（升序排列） | 输出 |
| work | 单/双精度 | 若info=0，work(0)返回最佳lwork | 输出 |
| lwork | 整数型 | work数组的长度。 lwork ≥ max(1, 2\*n\-1)。 | 输入 |
| rwork（复数类型特有） | 在chegv中为单精度复数型数组。 在zhegv中为双精度复数型数组。 | 工作数组，用于临时存储数据。 | 输出 |
| info | 整数型 | 状态值： 等于0：表示成功。 小于0：第\-info个参数值不合法。 大于0：算法出错。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface:
```
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)
```
