一般矩阵变换到两对角矩阵。
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