?sy(he)trd_2stage
Transform a symmetric or Hermitian matrix to symmetric or Hermitian tridiagonal. That is, AH * A * Q = T, where Q is an orthogonal matrix.
Interface Definition
C interface:
void ssytrd_2stage(const char *VECT, const char *UPLO, const int *N, float *A, const int *LDA, float *D, float *E, float *TAU, float *HOUS2, int *LHOUS2, float *WORK, const int *LWORK, int *INFO);
void dsytrd_2stage(const char *VECT, const char *UPLO, const int *N, double *A, const int *LDA, double *D, double *E, double *TAU, double *HOUS2, int *LHOUS2, double *WORK, const int *LWORK, int *INFO);
void chetrd_2stage(const char *VECT, const char *UPLO, const int *N, float _Complex *A, const int *LDA, float *D, float *E, float _Complex *TAU, float _Complex *HOUS2, int *LHOUS2, float _Complex *WORK, const int *LWORK, int *INFO);
void zhetrd_2stage(const char *VECT, const char *UPLO, const int *N, double _Complex *A, const int *LDA, double *D, double *E, double _Complex *TAU, double _Complex *HOUS2, int *LHOUS2, double _Complex *WORK, const int *LWORK, int *INFO);
Fortran interface:
SSYTRD_2STAGE(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO);
DSYTRD_2STAGE(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO);
CHETRD_2STAGE(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO);
ZHETRD_2STAGE(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO);
Parameters
Parameter |
Type |
Description |
Input/Output |
|---|---|---|---|
VECT |
Character |
|
Input |
UPLO |
Character |
|
Input |
N |
|
Number of columns of matrix A, N ≥ 0 |
Input |
A |
|
Matrix A, with a dimension of (LDA, N) |
Input/Output |
LDA |
Integer |
Leading dimension of matrix A. LDA ≥ max(1, N) |
Input |
D |
|
Diagonal element of symmetric tridiagonal matrix T, with a dimension of N |
Output |
E |
|
Non-diagonal element of symmetric tridiagonal matrix T, with a dimension of N-1 |
Output |
TAU |
|
Scalar factor for the elementary reflector |
Output |
HOUS2 |
|
Householder expression in the second phase |
Output |
LHOUS2 |
Integer |
Length of HOUS2
|
Input |
WORK |
|
Work array, with a size of LWORK |
Output |
LWORK |
Integer |
Length of the work array, LWORK ≥ max(1, dimension). dimension = max(stage1, stage2) + (KD+1)*N = N*KD + N*max(KD+1, FACTOPTNB) + max(2*KD*KD, KD*NTHREADS) + (KD+1)*N. When LWORK = -1, the optimal LWORK value is returned. |
Input |
INFO |
Integer |
|
Output |
Dependencies
include "klapack.h"
Examples
C interface:
char vect = 'N';
char uplo = 'L';
int n = 4;
int lda = n;
int info = 0;
double tau = (double*)malloc(n * sizeof(double));
double *work = NULL;
double *hous2 = NULL;
double qwork;
double qhous2;
int lwork = -1;
int lhous2 = -1;
double *d = (double*)malloc(n * sizeof(double));
double *e = (double*)malloc((n - 1) * sizeof(double));
double a[] = {0.521739, 0.043478, 0.304348, 0.130435,
0.043478, 0.304348, 0.043478, 0.652174,
0.304348, 0.043478, 0.086957, 0.521739,
0.130435, 0.652174, 0.521739, 0.086957};
/* Query optimal work size and hous2 size */
dsytrd_2stage_(&vect, &uplo, &n, a, &lda, d, e, tau, &qhous2, &lhous2, &qwork, &lwork, &info)
if (info != 0) {
return ERROR;
}
lwork = (int)qwork;
work = (double *)malloc(sizeof(double) * lwork);
lhous2 = (int)qhous2;
hous2 = (double*)malloc(lhous2 * sizeof(double));
/* Calculate */
dsytrd_2stage_(&vect, &uplo, &n, a, &lda, d, e, tau, hous2, &lhous2, work, &lwork, &info);
if (info != 0) {
return ERROR;
}
free(work);
free(hous2);
free(tau);
/*
* Output:
* A output (stored in column-major)
* 0.521739 0.043478 0.304348 0.130435
* 0.043478 0.304348 0.043478 0.652174
* 0.304348 0.043478 0.086957 0.521739
* 0.130435 0.652174 0.521739 0.086957
*
* D output (stored in column-major)
* 0.521739 0.538688 0.325765 -0.386192
*
* E output (stored in column-major)
* -0.333963 -0.507861 -0.471868
*/
Fortran interface:
CHARACTER :: vect = "N"
CHARACTER :: uplo = "L"
PARAMETER (n = 4)
PARAMETER (lda = 4)
INTEGER :: info = 0
REAL(8) :: tau(4)
REAL(8) :: qwork(1)
REAL(8) :: qhous2(1)
INTEGER :: lwork = -1
INTEGER :: lhous2 = -1
REAL(8), ALLOCATABLE :: work(:)
REAL(8), ALLOCATABLE :: hous2(:)
REAL(8), ALLOCATABLE :: d(:)
REAL(8), ALLOCATABLE :: e(:)
*
* tau:
* 1.003949 1.125229 1.978923 0.000000
* A (4x4, stored in column-major):
* 0.521739, 0.043478, 0.304348, 0.130435,
* 0.043478, 0.304348, 0.043478, 0.652174,
* 0.304348, 0.043478, 0.086957, 0.521739,
* 0.130435, 0.652174, 0.521739, 0.086957
*
REAL(8) :: a(m, n)
DATA a / 0.521739, 0.043478, 0.304348, 0.130435,
$ 0.043478, 0.304348, 0.043478, 0.652174,
$ 0.304348, 0.043478, 0.086957, 0.521739,
$ 0.130435, 0.652174, 0.521739, 0.086957 /
EXTERNAL DORGLQ
* Query optimal work size and hous2 size.
CALL DSYTRD_2STAGE(vect, uplo, n, a, lda, d, e, tau, qhous2, lhous2, qwork, lwork, info)
IF (info.NE.0) THEN
CALL EXIT(1)
END IF
lwork = INT(qwork(1))
ALLOCATE(work(lwork))
lhous2 = INT(qhous2(1))
ALLOCATE(hous2(lhous2))
* Calculate
CALL DSYTRD_2STAGE(vect, uplo, n, a, lda, d, e, tau, hous2, lhous2, work, lwork, info)
DEALLOCATE(work)
DEALLOCATE(hous2)
* Output:
* A output (stored in column-major)
* 0.521739 0.043478 0.304348 0.130435
* 0.043478 0.304348 0.043478 0.652174
* 0.304348 0.043478 0.086957 0.521739
* 0.130435 0.652174 0.521739 0.086957
*
* D output (stored in column-major)
* 0.521739 0.538688 0.325765 -0.386192
*
* E output (stored in column-major)
* -0.333963 -0.507861 -0.471868