---
title: Kml?steqr2
description: "LAPACK函数 ?STEQR 的修改版本（仅有V case），使用隐式QL或QR方法计算对称三对角矩阵的所有特征值和可选的特征向量。用于KML ScaLAPACK中，ScaLAPACK各进程可以调用该函数分别对分布式矩阵Q进行更新。仅有C格式接口，无fortran格式接口。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0785.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0785.html
indexId: 5c7762ca405491b4e825e6af34d22ff7c2dfaaf7c8631e035b374025c46781b361
---
# Kml?steqr2

LAPACK函数 ?STEQR 的修改版本（仅有V case），使用隐式QL或QR方法计算对称三对角矩阵的所有特征值和可选的特征向量。用于KML ScaLAPACK中，ScaLAPACK各进程可以调用该函数分别对分布式矩阵Q进行更新。仅有C格式接口，无fortran格式接口。

#### 接口定义

C Interface：

int KmlSsteqr2(constint n, float*d, float*e, float*z, constint ldz, constint nr, float *work);

int KmlDsteqr2(const int n, double *d, double *e, double *z, const int ldz, const int nr, double *work);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| N | 整数型 | 矩阵的行数/列数 | 输入 |
| D | KmlSsteqr2中为单精度浮点型数组 KmlDsteqr2中为双精度浮点型数组 | 维度为N 输入时，存放三对角矩阵的对角元素。 输出时，如果INFO为0，特征值升序排列 | 输入，输出 |
| E | KmlSsteqr2中为单精度浮点型数组 KmlDsteqr2中为双精度浮点型数组 | 维度为N\-1 输入时，存放三对角矩阵的次对角线元素 输出时，E被销毁 | 输入 |
| Z | KmlSsteqr2中为单精度浮点型数组 KmlDsteqr2中为双精度浮点型数组 | 维度为N\*N 输入时，存放正交矩阵 输出时，如果INFO为0，存放正交特征向量 | 输入，输出 |
| LDZ | 整数型 | 矩阵Z的主维，LDZ >= max(1,N) | 输入 |
| NR | 整数型 | NR = MAX(1, NUMROC( N, NB, MYPROW, 0, NPROCS ) ) | 输入 |
| WORK | KmlSsteqr2中为单精度浮点型数组 KmlDsteqr2中为双精度浮点型数组 | 工作数组，维度为max(1,2\*N\-2) | 输入 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
const int n = 4;
const int ldz = 4;
const int nr = 2;
double d[] = {14.1234, 15.5678, 16.9012, 17.3456};
double e[] = {18.7890, 19.1234, 20.5678, 21.9012};
double *z = (double *)malloc(ldz * n * sizeof(double));
// 1st column
z[0 * ldz + 0] = 0.5;
z[0 * ldz + 1] = 0.5;
z[0 * ldz + 2] = 0.5;
z[0 * ldz + 3] = 0.5;
// 2nd column
z[1 * ldz + 0] = 0.5;
z[1 * ldz + 1] = -0.5;
z[1 * ldz + 2] = 0.5;
z[1 * ldz + 3] = -0.5;
// 3rd column
z[2 * ldz + 0] = 0.5;
z[2 * ldz + 1] = 0.5;
z[2 * ldz + 2] = -0.5;
z[2 * ldz + 3] = -0.5;
// 4th column
z[3 * ldz + 0] = 0.5;
z[3 * ldz + 1] = -0.5;
z[3 * ldz + 2] = -0.5;
z[3 * ldz + 3] = 0.5;
double *work = (double *)malloc((2 * n - 2) * sizeof(double));
KmlDsteqr2(n, d, e, z, ldz, nr, work);
/*
* Output:
d :
-1.534857e+01   3.519426e+00   2.804530e+01   4.772184e+01
z :
-1.449053e-03   2.307024e-01   -8.569433e-02   9.692424e-01
-9.756888e-01   1.491886e-03   -2.181372e-01   -2.110012e-02
5.000000e-01   5.000000e-01   -5.000000e-01   -5.000000e-01
5.000000e-01   -5.000000e-01   -5.000000e-01   5.000000e-01
*/
```
