---
title: ?steqr
description: "使用QL或QR方法求解对称三对角矩阵的特征值和特征向量。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_kml_16_0701.html
sourcePath: /source/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_kml_16_0701.html
indexId: d458087fe9bb45a8d7047fad89993359768fe725f700299b7ee0e2d84d500c8676
---
# ?steqr

使用QL或QR方法求解对称三对角矩阵的特征值和特征向量。

#### 接口定义

C Interface：

ssteqr_(const char *compz, const int *n, float *d, float *e, float *z, const int *ldz, float *work, int *info);

dsteqr_(const char *compz, const int *n, double *d, double *e, double *z, const int *ldz, double *work, int *info);

csteqr_(const char *compz, const int *n, float *d, float *e, float _Complex *z, const int *ldz, float *work, int *info);

zsteqr_(const char *compz, const int *n, double *d, double *e, double _Complex *z, const int *ldz, double *work, int *info);

Fortran Interface：

SSTEQR(COMPZ, N, D, E, Z, LDZ, WORK, INFO);

DSTEQR(COMPZ, N, D, E, Z, LDZ, WORK, INFO);

CSTEQR(COMPZ, N, D, E, Z, LDZ, WORK, INFO);

ZSTEQR(COMPZ, N, D, E, Z, LDZ, WORK, INFO);


#### 参数

| 参数 | 类型 | 说明 | 输入/输出 |
| --- | --- | --- | --- |
| compz | 字符型 | 'N'：只计算特征值。 'V'：计算特征值和特征向量。 'I'： 计算特征值和特征向量。 | 输入 |
| n | 整数型 | 矩阵的维度，n≥0。 | 输入 |
| d | 在ssteqr中为单精度浮点型数组。 在dsteqr中为双精度浮点型数组。 在csteqr中为单精度浮点型数组。 在zsteqr中为双精度浮点型数组。 | 长度为n。 进入时：三对角矩阵的对角元素。 退出时：若info=0，保存特征值，并以升序排列。 | 输入，输出 |
| e | 在ssteqr中为单精度浮点型数组。 在dsteqr中为双精度浮点型数组。 在csteqr中为单精度浮点型数组。 在zsteqr中为双精度浮点型数组。 | 长度为n\-1。 进入时：三对角矩阵的次对角元素。 退出时：被销毁。 | 输入，输出 |
| z | 在ssteqr中为单精度浮点型数组。 在dsteqr中为双精度浮点型数组。 在csteqr中为单精度复数型数组。 在zsteqr中为双精度复数型数组。 | 大小为ldz\*n。 进入时：若compz='V'时，则为正交矩阵。 退出时： 若info=0，且compz='V'时，则为原对称矩阵的正交特征向量。 若compz='I'时，则为对称三对角矩阵的正交特征向量。 若compz='N'时，不使用。 | 输入，输出 |
| ldz | 整数型 | 矩阵z的主维，ldz ≥ max(1, n)。 | 输入 |
| work | 在ssteqr中为单精度浮点型数组。 在dsteqr中为双精度浮点型数组。 在csteqr中为单精度浮点型数组。 在zsteqr中为双精度浮点型数组。 | 工作数组，大小为max(1, 2\*n\-2)。当compz='N'时，不使用。 | 输出 |
| info | 整数型 | 等于0：表示成功。 小于0：info=\-i，表示第i个参数非法。 大于0：算法无法在30\*n次的迭代中找到所有特征值。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
const char compz = 'N';
const int n = 4;
const int ldz = 4;
int info = 0;
double d[] = {72.1673, 66.1857, 64.7644, 28.0199, 91.4151};
double e[] = {6.8955, 7.2465, 3.5019, 8.2268, 3.5287};
int *ipiv = (int*)malloc(n * sizeof(int));
double b[] = {9.4532, 1.5204, 2.2127, 0.9891, 7.1778,
6.8955, 7.2465, 3.5019, 8.2268, 3.5287};
double *z = (double*)malloc(ldz * n * sizeof(double));
double *work = (double*)malloc(n * sizeof(double));
dsteqr_(&compz, &n, d, e, z, &ldz, work, &info);
if (info != 0) {
printf("ERROR, info = %d\n", info);
}
/* output */
* d
* 27.676252       56.816901       68.501999       78.142148
* e
* 0.000000        0.000000        0.000000
```

Fortran Interface：

```
CHARACTER :: compz = "N"
PARAMETER (n = 4)
PARAMETER (ldz = 4)
INTEGER :: info = 0
REAL(8) :: d(n)
REAL(8) :: e(n-1)
REAL(8) :: z(ldz, n)
REAL(8) :: work(n)
DATA d / 72.1673, 66.1857, 64.7644, 28.0199 /
DATA e / 6.8955, 7.2465, 3.5019 /
EXTERNAL DSTEQR
CALL DSTEQR(compz, n, d, e, z, ldz, work, info);
*
* Output:
* d:
* 27.676252       56.816901       68.501999       78.142148
* e:
* 0.000000        0.000000        0.000000
```
