|
mxlib
c++ tools for analyzing astronomical data and other tasks by Jared R. Males. [git repo]
|
Templatized interface to the Lapack library
Functions | |
| template<typename dataT> | |
| dataT | mx::math::lamch (char CMACH) |
| Determine machine parameters. | |
| template<typename dataT> | |
| MXLAPACK_INT | mx::math::sytrd (char UPLO, MXLAPACK_INT N, dataT *A, MXLAPACK_INT LDA, dataT *D, dataT *E, dataT *TAU, dataT *WORK, MXLAPACK_INT LWORK, MXLAPACK_INT INFO) |
| Reduce a real symmetric matrix to real symmetric tridiagonal form by an orthogonal similarity transformation. | |
| template<typename dataT> | |
| MXLAPACK_INT | mx::math::laed9 (dataT *D, dataT *Q, dataT *S, MXLAPACK_INT K, MXLAPACK_INT KSTART, MXLAPACK_INT KSTOP, MXLAPACK_INT N, MXLAPACK_INT LDQ, dataT RHO, dataT *DLAMDA, dataT *W, MXLAPACK_INT LDS) |
| Solve selected roots of a diagonal-plus-rank-one secular equation and form its eigenvectors. | |
| template<typename dataT> | |
| MXLAPACK_INT | mx::math::syevr (char JOBZ, char RANGE, char UPLO, MXLAPACK_INT N, dataT *A, MXLAPACK_INT LDA, dataT VL, dataT VU, MXLAPACK_INT IL, MXLAPACK_INT IU, dataT ABSTOL, MXLAPACK_INT *M, dataT *W, dataT *Z, MXLAPACK_INT LDZ, MXLAPACK_INT *ISUPPZ, dataT *WORK, MXLAPACK_INT LWORK, MXLAPACK_INT *IWORK, MXLAPACK_INT LIWORK) |
| Compute selected eigenvalues and, optionally, eigenvectors of a real symmetric matrix. | |
| template<typename dataT> | |
| MXLAPACK_INT | mx::math::gesvd (char JOBU, char JOBVT, MXLAPACK_INT M, MXLAPACK_INT N, dataT *A, MXLAPACK_INT LDA, dataT *S, dataT *U, MXLAPACK_INT LDU, dataT *VT, MXLAPACK_INT LDVT, dataT *WORK, MXLAPACK_INT LWORK) |
| Compute the singular value decomposition (SVD) of a real matrix. | |
| template<typename dataT> | |
| MXLAPACK_INT | mx::math::gesdd (char JOBZ, MXLAPACK_INT M, MXLAPACK_INT N, dataT *A, MXLAPACK_INT LDA, dataT *S, dataT *U, MXLAPACK_INT LDU, dataT *VT, MXLAPACK_INT LDVT, dataT *WORK, MXLAPACK_INT LWORK, MXLAPACK_INT *IWORK) |
| Compute the singular value decomposition (SVD) of a real matrix with GESDD. | |
| MXLAPACK_INT mx::math::gesdd | ( | char | JOBZ, |
| MXLAPACK_INT | M, | ||
| MXLAPACK_INT | N, | ||
| dataT * | A, | ||
| MXLAPACK_INT | LDA, | ||
| dataT * | S, | ||
| dataT * | U, | ||
| MXLAPACK_INT | LDU, | ||
| dataT * | VT, | ||
| MXLAPACK_INT | LDVT, | ||
| dataT * | WORK, | ||
| MXLAPACK_INT | LWORK, | ||
| MXLAPACK_INT * | IWORK ) |
Compute the singular value decomposition (SVD) of a real matrix with GESDD.
This documentation copied shamelessly from the LAPACK source at netlib.
SGESDD computes the singular value decomposition (SVD) of a real M-by-N matrix A, optionally computing the left and right singular vectors. If singular vectors are desired, it uses a divide-and-conquer algorithm.
The SVD is written
\[ A = U \Sigma V^T \]
where \( \Sigma \) is an M-by-N matrix which is zero except for its min(m,n) diagonal elements, \( U \) is an M-by-M orthogonal matrix, and \( V \) is an N-by-N orthogonal matrix. The diagonal elements of \( \Sigma \) are the singular values of A; they are real and non-negative, and are returned in descending order. The first min(m,n) columns of U and V are the left and right singular vectors of A.
Note that the routine returns \( V^T \), not \( V \).
The divide and conquer algorithm makes very mild assumptions about floating point arithmetic. It will work on machines with a guard digit in add/subtract, or on those binary machines without guard digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. It could conceivably fail on hexadecimal or decimal machines without guard digits, but the authors know of none.
| [in] | JOBZ | JOBZ is CHARACTER*1 Specifies options for computing all or part of the matrix U: = 'A': all M columns of U and all N rows of V**T are returned in the arrays U and VT; = 'S': the first min(M,N) columns of U and the first min(M,N) rows of V**T are returned in the arrays U and VT; = 'O': If M >= N, the first N columns of U are overwritten on the array A and all rows of V**T are returned in the array VT; otherwise, all columns of U are returned in the array U and the first M rows of V**T are overwritten in the array A; = 'N': no columns of U or rows of V**T are computed. |
| [in] | M | M is INTEGER The number of rows of the input matrix A. M >= 0. |
| [in] | N | N is INTEGER The number of columns of the input matrix A. N >= 0. |
| [in,out] | A | A is REAL array, dimension (LDA,N) On entry, the M-by-N matrix A. On exit, if JOBZ = 'O', A is overwritten with the first N columns of U (the left singular vectors, stored columnwise) if M >= N; A is overwritten with the first M rows of V**T (the right singular vectors, stored rowwise) otherwise. if JOBZ .ne. 'O', the contents of A are destroyed. |
| [in] | LDA | LDA is INTEGER The leading dimension of the array A. LDA >= max(1,M). |
| [out] | S | S is REAL array, dimension (min(M,N)) The singular values of A, sorted so that S(i) >= S(i+1). |
| [out] | U | U is REAL array, dimension (LDU,UCOL) UCOL = M if JOBZ = 'A' or JOBZ = 'O' and M < N; UCOL = min(M,N) if JOBZ = 'S'. If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M orthogonal matrix U; if JOBZ = 'S', U contains the first min(M,N) columns of U (the left singular vectors, stored columnwise); if JOBZ = 'O' and M >= N, or JOBZ = 'N', U is not referenced. |
| [in] | LDU | LDU is INTEGER The leading dimension of the array U. LDU >= 1; if JOBZ = 'S' or 'A' or JOBZ = 'O' and M < N, LDU >= M. |
| [out] | VT | VT is REAL array, dimension (LDVT,N) If JOBZ = 'A' or JOBZ = 'O' and M >= N, VT contains the N-by-N orthogonal matrix V**T; if JOBZ = 'S', VT contains the first min(M,N) rows of V**T (the right singular vectors, stored rowwise); if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced. |
| [in] | LDVT | LDVT is INTEGER The leading dimension of the array VT. LDVT >= 1; if JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N; if JOBZ = 'S', LDVT >= min(M,N). |
| [out] | WORK | WORK is REAL array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK; |
| [in] | LWORK | LWORK is INTEGER The dimension of the array WORK. LWORK >= 1. If JOBZ = 'N', LWORK >= 3*min(M,N) + max(max(M,N),6*min(M,N)). If JOBZ = 'O', LWORK >= 3*min(M,N) + max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)). If JOBZ = 'S' or 'A' LWORK >= min(M,N)*(7+4*min(M,N)) For good performance, LWORK should generally be larger. If LWORK = -1 but other input arguments are legal, WORK(1) returns the optimal LWORK. |
| [out] | IWORK | IWORK is INTEGER array, dimension (8*min(M,N)) |
Definition at line 718 of file templateLapack.hpp.
Referenced by eigenGESDD().
| MXLAPACK_INT mx::math::gesvd | ( | char | JOBU, |
| char | JOBVT, | ||
| MXLAPACK_INT | M, | ||
| MXLAPACK_INT | N, | ||
| dataT * | A, | ||
| MXLAPACK_INT | LDA, | ||
| dataT * | S, | ||
| dataT * | U, | ||
| MXLAPACK_INT | LDU, | ||
| dataT * | VT, | ||
| MXLAPACK_INT | LDVT, | ||
| dataT * | WORK, | ||
| MXLAPACK_INT | LWORK ) |
Compute the singular value decomposition (SVD) of a real matrix.
xGESVD computes the singular value decomposition (SVD) of a real M-by-N matrix A, optionally computing the left and/or right singular vectors. The SVD is written
\( A = U * \Sigma * V^T \)
where \( \Sigma \) is an M-by-N matrix which is zero except for its min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and V is an N-by-N orthogonal matrix. The diagonal elements of \( \Sigma \) are the singular values of A; they are real and non-negative, and are returned in descending order. The first min(m,n) columns of U and V are the left and right singular vectors of A.
Note that the routine returns \( V^T \), not \( V \).
See more details: http://www.netlib.org/lapack/explore-html/d8/d49/sgesvd_8f.html. This documentation is taken from there.
| dataT | is the data type of the arrays, and determines which underlying Lapack routine is called. |
| [in] | JOBU | (char) Specifies options for computing all or part of the matrix U: = 'A': all M columns of U are returned in array U = 'S': the first min(m,n) columns of U (the left singular vectors) are returned in the array U = 'O': the first min(m,n) columns of U (the left singular vectors) are overwritten on the array A = 'N': no columns of U (no left singular vectors) are computed. |
| [in] | JOBVT | (char) Specifies options for computing all or part of the matrix V**T: = 'A': all N rows of V**T are returned in the array VT = 'S': the first min(m,n) rows of V**T (the right singular vectors) are returned in the array VT = 'O': the first min(m,n) rows of V**T (the right singular vectors) are overwritten on the array A = 'N': no rows of V**T (no right singular vectors) are computed. |
JOBVT and JOBU cannot both be 'O'.
| [in] | M | (MXLAPACK_INT) The number of rows of the input matrix A. M >= 0. |
| [in] | N | (MXLAPACK_INT) The number of columns of the input matrix A. N >= 0. |
| [in,out] | A | (dataT *, dimension (LDA,N)) On entry: the M-by-N matrix A. On exit: if JOBU = 'O', A is overwritten with the first min(m,n) columns of U (the left singular vectors, stored columnwise) if JOBVT = 'O', A is overwritten with the first min(m,n) rows of V**T (the right singular vectors, stored rowwise) if JOBU != 'O' and JOBVT .ne. 'O', the contents of A are destroyed. |
| [in] | LDA | (MXLAPACK_INT) The leading dimension of the array A. LDA >= max(1,M). |
| [out] | S | (dataT *, dimension (min(M,N)) The singular values of A, sorted so that S(i) >= S(i+1). |
| [out] | U | (dataT *, dimension (LDU,UCOL)) (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. If JOBU = 'A', U contains the M-by-M orthogonal matrix U if JOBU = 'S', U contains the first min(m,n) columns of U (the left singular vectors, stored columnwise) if JOBU = 'N' or 'O', U is not referenced. |
| [in] | LDU | (MXLAPACK_INT) The leading dimension of the array U. LDU >= 1 if JOBU == 'S' or 'A', LDU >= M. |
| [out] | VT | (dataT *, dimension (LDVT,N)) If JOBVT = 'A', VT contains the N-by-N orthogonal matrix V**T if JOBVT = 'S', VT contains the first min(m,n) rows of V**T (the right singular vectors, stored rowwise) if JOBVT = 'N' or 'O', VT is not referenced. |
| [in] | LDVT | (MXLAPACK_INT) The leading dimension of the array VT. LDVT >= 1 if JOBVT = 'A', LDVT >= N if JOBVT = 'S', LDVT >= min(M,N). |
| [out] | WORK | (dataT *, dimension (MAX(1,LWORK)) ) On exit, if INFO = 0, WORK[1] returns the optimal LWORK if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged superdiagonal elements of an upper bidiagonal matrix B whose diagonal is in S (not necessarily sorted). B satisfies A = U * B * VT, so it has the same singular values as A, and singular vectors related by U and VT. |
| [in] | LWORK | (MXLAPACK_INT) The dimension of the array WORK. LWORK >= MAX(1,5*MIN(M,N)) for the paths (see comments inside code):
|
If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.
Definition at line 524 of file templateLapack.hpp.
| MXLAPACK_INT mx::math::laed9 | ( | dataT * | D, |
| dataT * | Q, | ||
| dataT * | S, | ||
| MXLAPACK_INT | K, | ||
| MXLAPACK_INT | KSTART, | ||
| MXLAPACK_INT | KSTOP, | ||
| MXLAPACK_INT | N, | ||
| MXLAPACK_INT | LDQ, | ||
| dataT | RHO, | ||
| dataT * | DLAMDA, | ||
| dataT * | W, | ||
| MXLAPACK_INT | LDS ) |
Solve selected roots of a diagonal-plus-rank-one secular equation and form its eigenvectors.
This is a typed wrapper for LAPACK xLAED9. The routine computes selected eigenvalues and the associated eigenvectors for
\[ \operatorname{diag}(\mathtt{DLAMDA}) + \mathtt{RHO}\,\mathtt{W}\mathtt{W}^{T}. \]
| dataT | Floating-point type; supported specializations are float and double. |
| [out] | D | N-element array of selected updated eigenvalues |
| [out] | Q | LDQ-by-N secular-equation workspace produced by LAPACK |
| [out] | S | LDS-by-K updated eigenvectors, stored column-wise |
| [in] | K | number of terms in the secular equation |
| [in] | KSTART | first updated eigenvalue to compute, inclusive and one-based |
| [in] | KSTOP | last updated eigenvalue to compute, inclusive and one-based |
| [in] | N | Q matrix dimension, at least K |
| [in] | LDQ | leading dimension of Q, at least max(1,N) |
| [in] | RHO | positive rank-one update weight |
| [in] | DLAMDA | K-element array of strictly increasing diagonal poles |
| [in,out] | W | K deflation-adjusted update components |
| [in] | LDS | leading dimension of S, at least max(1,K) |
Definition at line 245 of file templateLapack.hpp.
Referenced by laed9< double >(), laed9< float >(), and TEST_CASE().
| dataT mx::math::lamch | ( | char | CMACH | ) |
Determine machine parameters.
Wrapper for Lapack xLAMCH
See more details at http://www.netlib.org/lapack/lapack-3.1.1/html/slamch.f.html.
| dataT | is the data type of the arrays, and determines which underlying Lapack routine is called. |
| [in] | CMACH | Specifies the value to be returned by SLAMCH:
= 'E' or 'e', returns eps, the relative machine precision
= 'S' or 's , returns sfmin, the safe minimum, such that 1/sfmin does not overflow
= 'B' or 'b', returns base, the base of the machine
= 'P' or 'p', returns eps*base
= 'N' or 'n', returns t, the number of (base) digits in the mantissa
= 'R' or 'r', returns rnd, 1.0 when rounding occurs in addition, 0.0 otherwise
= 'M' or 'm', returns emin, the minimum exponent before (gradual) underflow
= 'U' or 'u', returns rmin, the underflow threshold - base^(emin-1)
= 'L' or 'l', returns emax, the largest exponent before overflow
= 'O' or 'o', returns rmax, the overflow threshold - (base^emax)*(1-eps)
|
Definition at line 104 of file templateLapack.hpp.
Referenced by eigenSYEVR(), and TEST_CASE().
| MXLAPACK_INT mx::math::syevr | ( | char | JOBZ, |
| char | RANGE, | ||
| char | UPLO, | ||
| MXLAPACK_INT | N, | ||
| dataT * | A, | ||
| MXLAPACK_INT | LDA, | ||
| dataT | VL, | ||
| dataT | VU, | ||
| MXLAPACK_INT | IL, | ||
| MXLAPACK_INT | IU, | ||
| dataT | ABSTOL, | ||
| MXLAPACK_INT * | M, | ||
| dataT * | W, | ||
| dataT * | Z, | ||
| MXLAPACK_INT | LDZ, | ||
| MXLAPACK_INT * | ISUPPZ, | ||
| dataT * | WORK, | ||
| MXLAPACK_INT | LWORK, | ||
| MXLAPACK_INT * | IWORK, | ||
| MXLAPACK_INT | LIWORK ) |
Compute selected eigenvalues and, optionally, eigenvectors of a real symmetric matrix.
xSYEVR computes selected eigenvalues and, optionally, eigenvectors of a real symmetric matrix A. Eigenvalues and eigenvectors can be selected by specifying either a range of values or a range of indices for the desired eigenvalues.
See more details: http://www.netlib.org/lapack/lapack-3.1.1/html/ssyevr.f.html.
Definition at line 302 of file templateLapack.hpp.
| MXLAPACK_INT mx::math::sytrd | ( | char | UPLO, |
| MXLAPACK_INT | N, | ||
| dataT * | A, | ||
| MXLAPACK_INT | LDA, | ||
| dataT * | D, | ||
| dataT * | E, | ||
| dataT * | TAU, | ||
| dataT * | WORK, | ||
| MXLAPACK_INT | LWORK, | ||
| MXLAPACK_INT | INFO ) |
Reduce a real symmetric matrix to real symmetric tridiagonal form by an orthogonal similarity transformation.
xSYTRD reduces a real symmetric matrix A to real symmetric tridiagonal form T by an orthogonal similarity transformation:
\( Q^T * A * Q = T. \)
For more see: http://www.netlib.org/lapack/lapack-3.1.1/html/ssytrd.f.html
| dataT | is the data type |
| UPLO | 'U': Upper triangle of A is stored, 'L': Lower triangle of A is stored. |
| N | The order of the matrix A. N >= 0. |
| A | array, dimension (LDA,N) |
| LDA | The leading dimension of the array A. LDA >= max(1,N). |
| D | (output) array, dimension (N), the diagonal elements of the tridiagonal matrix T: |
| E | (output) array, dimension (N-1), the off-diagonal elements of the tridiagonal matrix T: |
| TAU | (output) array, dimension (N-1), the scalar factors of the elementary reflectors (see Further Details). |
| WORK | (workspace/output) array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK. |
| LWORK | (input) The dimension of the array WORK. LWORK >= 1. For optimum performance LWORK >= N*NB, where NB is the optimal blocksize. |
| INFO | (output) 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value |
Definition at line 183 of file templateLapack.hpp.