?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