---
title: ?gebrd
description: "一般矩阵变换到两对角矩阵。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0763.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0763.html
indexId: 6b399db16d217321c9507fa504d2a037d7c877e3e16b3ea818fbc02d58b9b08061
---
# ?gebrd

一般矩阵变换到两对角矩阵。

#### 接口定义

C Interface：

sgebrd_(const int *m, const int *n, float *a, const int *lda, float *d, float *e, float *tauq, float *taup, float *work, const int lwork, int *info);

dgebrd_(const int *m, const int *n, double *a, const int *lda, double *d, double *e, double *tauq, double *taup, double *work, const int lwork, int *info);

cgebrd_(const int *m, const int *n, float _Complex *a, const int *lda, float *d, float *e, float _Complex *tauq, float _Complex *taup, float _Complex *work,

const int lwork, int *info);

zgebrd_(const int *m, const int *n, double _Complex *a, const int *lda, double *d, double *e, double _Complex *tauq, double _Complex *taup, double _Complex *work,

const int lwork, int *info);

Fortran Interface：

SGEBRD(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO);

DGEBRD(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO);

CGEBRD(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO);

ZGEBRD(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO);


#### 参数

| 参数 | 类型 | 说明 | 输入/输出 |
| --- | --- | --- | --- |
| m | 整数型 | 矩阵a的行数，m≥0。 | 输入 |
| n | 整数型 | 矩阵a的列数，n≥0。 | 输入 |
| a | 在sgebrd中为单精度浮点型数组 在dgebrd中为双精度浮点型数组 在cgebrd中为单精度复数型数组 在zgebrd中为双精度复数型数组 | 大小为lda\*n 进入时：m\*n的矩阵。 退出时： 若m≥n，其对角线和超对角线位置被上双对角矩阵B，对角线以下的位置保存tauq数组，超对角线上方位置保存taup数组。 若m＜n，其对角线和次对角线位置被下双对角矩阵B，次对角线以下的位置保存tauq数组，对角线上方位置保存taup数组。 | 输入，输出 |
| lda | 整数型 | 矩阵a的主维，lda≥max(1, m)。 | 输入 |
| d | 在sgebrd中为单精度浮点型数组 在dgebrd中为双精度浮点型数组 在cgebrd中为单精度浮点型数组 在zgebrd中为双精度浮点型数组 | 长度为min(m, n)。 双对角。 | 输入，输出 |
| e | 在sgebrd中为单精度浮点型数组 在dgebrd中为双精度浮点型数组 在cgebrd中为单精度浮点型数组 在zgebrd中为双精度浮点型数组 | 大小为ldz\*n 进入时：若compz='V'时，则为正交矩阵。 退出时： 若info=0，且compz='V'时，则为原对称矩阵的正交特征向量。 若compz='I'时，则为对称三对角矩阵的正交特征向量。 若compz='N'时，不使用。 | 输入，输出 |
| tauq | 在sgebrd中为单精度浮点型数组 在dgebrd中为双精度浮点型数组 在cgebrd中为单精度复数型数组 在zgebrd中为双精度复数型数组 | 矩阵z的主维，ldz >=1；若需要求特征向量，则ldz ≥ max(1, n)。 | 输入 |
| taup | 在sstedc中为单精度浮点型数组 在dstedc中为双精度浮点型数组 在cstedc中为单精度复数型数组 在zstedc中为双精度复数型数组 | 工作数组，大小为max(1, lwork)。 退出时，若info=0，work(1)返回最优lwork大小。 | 输出 |
| work | 在sgebrd中为单精度浮点型数组 在dgebrd中为双精度浮点型数组 在cgebrd中为单精度复数型数组 在zgebrd中为双精度复数型数组 | 工作数组，大小为max(1, liwork)。 退出时，若info=0，iwork(1)返回最优liwork大小。 | 输出 |
| lwork | 整数型 | 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 int m = 5;
const int n = 5;
const int lda = 5;
double a[] = {72.1673, 66.1857, 64.7644, 28.0199, 91.4151,
6.5180,  62.8483, 72.4323, 46.5760, 8.6928,
28.9821, 42.1828, 18.6437, 99.8612, 35.6972,
67.9812, 5.0880,  85.5035, 79.2945, 54.5920,
28.6869, 49.7512, 7.5186,  28.6929, 84.6041};
double *d = (double*)malloc(m * sizeof(double));
double *e = (double*)malloc((m-1) * sizeof(double));
double *tauq = (double*)malloc(m * sizeof(double));
double *taup = (double*)malloc(m * sizeof(double));
double qwork;
int lwork = -1;
int info = 0;
dgebrd_(&m, &n, a, &lda, d, e, tauq, taup, &qwork, &lwork, &info);
if (info != 0) {
printf("Error, info = %d\n", info);
return info;
}
lwork = (int)qwork;
double *work = (double*)malloc(lwork * sizeof(double));
dgebrd_(&m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info);
if (info != 0) {
printf("Error, info = %d\n", info);
return info;
}
/* output */
* d
* -151.409804     -96.158378      30.604367       -49.958984      -65.000480
* e
* 187.838419      -61.829661      47.241856       4.133032
* tauq
* 1.476636        1.056414        1.268028        1.198872        0.000000
* taup
* 1.401567        1.618720        1.104858        0.000000        0.000000
```

Fortran Interface：

```
PARAMETER (m = 5)
PARAMETER (n = 5)
PARAMETER (lda = 5)
INTEGER :: info = 0
REAL(8) :: d(m)
REAL(8) :: e(m-1)
REAL(8) :: tauq(m)
REAL(8) :: taup(m)
REAL(8), ALLOCATABLE :: work(:)
INTEGER :: lwork = -1
REAL(8) :: qwork
DATA a / 72.1673, 66.1857, 64.7644, 28.0199, 91.4151,
6.5180,  62.8483, 72.4323, 46.5760, 8.6928,
28.9821, 42.1828, 18.6437, 99.8612, 35.6972,
67.9812, 5.0880,  85.5035, 79.2945, 54.5920,
28.6869, 49.7512, 7.5186,  28.6929, 84.6041/
EXTERNAL DGEBRD
CALL DGEBRD(m, n, a, lda, d, e, tauq, taup, qwork, lwork, info);
lwork = (int)qwork;
work = (double *)malloc(sizeof(double) * lwork);
CALL DGEBRD(m, n, a, lda, d, e, tauq, taup, work, lwork, info);
*
* Output:
* d
* -151.409804     -96.158378      30.604367       -49.958984      -65.000480
* e
* 187.838419      -61.829661      47.241856       4.133032
* tauq
* 1.476636        1.056414        1.268028        1.198872        0.000000
* taup
* 1.401567        1.618720        1.104858        0.000000        0.000000
```
