---
title: ?stedc
description: "对称三对角矩阵的特征值求解，使用Divide-and-Conquer算法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0757.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0757.html
indexId: 7e12df3917952781a91ae8b210c252c29e7cce8ebe963b2bf291552e62e1943d61
---
# ?stedc

对称三对角矩阵的特征值求解，使用Divide-and-Conquer算法。

#### 接口定义

C Interface：

sstedc_(const char *compz, const int *n, float *d, float *e, float *z, const int *ldz, float *work, const int lwork,

int *iwork, const int *liwork, int *info);

dstedc_(const char *compz, const int *n, double *d, double *e, double *z, const int *ldz, double *work, const int lwork,

int *iwork, const int *liwork, int *info);

cstedc_(const char *compz, const int *n, float *d, float *e, float _Complex *z, const int *ldz, float _Complex *work, const int lwork, float *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

zstedc_(const char *compz, const int *n, double *d, double *e, double _Complex *z, const int *ldz, double _Complex *work, const int lwork, double *rwork, const int *lrwork,

int *iwork, const int *liwork, int *info);

Fortran Interface：

SSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

DSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

CSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);

ZSTEDC(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO);


#### 参数

| 参数 | 类型 | 说明 | 输入/输出 |
| --- | --- | --- | --- |
| compz | 字符型 | 'N'：只计算特征值。 'V'：计算特征值和原Hermitian矩阵的特征向量。 'I'：计算特征值和三对角矩阵的特征向量。 | 输入 |
| n | 整数型 | 矩阵的维度，n≥0 | 输入 |
| d | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度浮点型数组 在zstedc中为双精度浮点型数组 | 长度为n 进入时：三对角矩阵的对角元素。 退出时：若info=0，保存特征值，并以升序排列。 | 输入，输出 |
| e | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度浮点型数组 在zstedc中为双精度浮点型数组 | 长度为n\-1 进入时：三对角矩阵的次对角元素。 退出时：被销毁。 | 输入，输出 |
| z | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度复数型数组 在zstedc中为双精度复数型数组 | 大小为ldz\*n 进入时：若compz='V'时，则为正交矩阵。 退出时： 若info=0，且compz='V'时，则为原对称矩阵的正交特征向量。 若compz='I'时，则为对称三对角矩阵的正交特征向量。 若compz='N'时，不使用。 | 输入，输出 |
| ldz | 整数型 | 矩阵z的主维，ldz >=1；若需要求特征向量，则ldz ≥ max(1, n)。 | 输入 |
| work | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度复数型数组 在zstedc中为双精度复数型数组 | 工作数组，大小为max(1, lwork)。 退出时，若info=0, work(1)返回最优lwork大小。 | 输出 |
| lwork | 整数型 | work数组的大小 若compz='N'或'I'，或n<=1：lwork>=1。 若compz='V'且n>1，lwork >= n\*n。 若lwork=\-1，表明函数将只查询最优的lwork大小。 | 输入 |
| rwork | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度浮点型数组 在zstedc中为双精度浮点型数组 | 工作数组，大小为max(1, lrwork). 退出时，若info=0，rwork(1)返回最优lrwork大小 | 输出 |
| lrwork | 整数型 | rwork数组的大小 若compz='N'或n<=1：lrwork>=1。 若compz='V'且 n>1，lrwork >= 1+3\*n+2\*n\*lgn+4\*n\*\*2，这里的lgn满足2\*\*k>=n的最小值。 若compz='I'且 n>1，lrwork>=1+4\*n+2\*n\*\*2。 若lrwork=\-1，表明函数将只查询最优的lrwork大小。 | 输入 |
| iwork | 整数型 | 工作数组，大小为max(1, liwork)。 退出时，若info=0，iwork(1)返回最优liwork大小。 | 输出 |
| liwork | 整数型 | iwork数组的大小 若compz='N'或n<=1：liwork>=1。 若compz='V'或n>1，liwork >= 6+6\*n+5\*n\*lgn。 若compz='I'或n>1，liwork>=3+5\*n。 若liwork=\-1，表明函数将只查询最优的liwork大小。 | 输入 |
| info | 整数型 | 等于0：表示成功。 小于0：info=\-i，表示第i个参数非法。 大于0：算法在处理位于INFO/(N+1)到mod(INFO,N+1)行、列中的子矩阵时无法计算特征值。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
const char compz = 'N';
const int n = 4;
const int ldz = 4;
double d[] = {72.1673, 66.1857, 64.7644, 28.0199};
double e[] = {6.8955, 7.2465, 3.5019};
double z[] = {0.924528, 0.056604, 0.415094, 0.924528,
0.622642, 0.905660, 0.150943, 0.471698,
0.132075, 0.566038, 0.811321, 0.924528,
0.339623, 0.283019, 0.679245, 0.283019};
int lwork = 1;
int liwork = 1;
double *work = (double*)malloc(lwork * sizeof(double));
int *iwork = (int*)malloc(liwork * sizeof(int));
int info = 0;
dstedc_(&compz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, &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
* z
* 0.924528        0.056604        0.415094        0.924528        0.622642        0.905660        0.150943        0.471698        0.132075        0.566038        * 0.811321        0.924528        0.339623        0.283019        0.679245        0.283019
```

Fortran Interface：

```
CHARACTER :: compz = "N"
PARAMETER (n = 4)
PARAMETER (ldz = 4)
PARAMETER (lwork = 1)
PARAMETER (liwork = -1)
INTEGER :: info = 0
REAL(8) :: d(n)
REAL(8) :: e(n-1)
REAL(8) :: z(ldz, n)
REAL(8) :: work(lwork)
INTEGER :: iwork(liwork)
DATA d / 72.1673, 66.1857, 64.7644, 28.0199 /
DATA e / 6.8955, 7.2465, 3.5019 /
DATA z / 0.924528, 0.056604, 0.415094, 0.924528,
0.622642, 0.905660, 0.150943, 0.471698,
0.132075, 0.566038, 0.811321, 0.924528,
0.339623, 0.283019, 0.679245, 0.283019/
EXTERNAL DSTEDC
CALL DSTEDC(compz, n, d, e, z, ldz, work, liwork, iwork, liwork, info);
*
* Output:
* d:
* 27.676252       56.816901       68.501999       78.142148
* e:
* 0.000000        0.000000        0.000000
* z:
* 0.924528        0.056604        0.415094        0.924528        0.622642        0.905660        0.150943        0.471698        0.132075        0.566038        * 0.811321        0.924528        0.339623        0.283019        0.679245        0.283019
```
