?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 |
|
大小为lda*n |
输入,输出 |
lda |
整数型 |
矩阵a的主维,lda≥max(1, m)。 |
输入 |
d |
|
|
输入,输出 |
e |
|
大小为ldz*n
|
输入,输出 |
tauq |
|
矩阵z的主维,ldz >=1;若需要求特征向量,则ldz ≥ max(1, n)。 |
输入 |
taup |
|
|
输出 |
work |
|
|
输出 |
lwork |
整数型 |
iwork数组的大小
|
输入 |
info |
整数型 |
|
输出 |
依赖
#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