mxlib
c++ tools for analyzing astronomical data and other tasks by Jared R. Males. [git repo]
Loading...
Searching...
No Matches

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.

Function Documentation

◆ gesdd()

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.

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.

Parameters
[in]JOBZJOBZ 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]MM is INTEGER The number of rows of the input matrix A. M >= 0.
[in]NN is INTEGER The number of columns of the input matrix A. N >= 0.
[in,out]AA 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]LDALDA is INTEGER The leading dimension of the array A. LDA >= max(1,M).
[out]SS is REAL array, dimension (min(M,N)) The singular values of A, sorted so that S(i) >= S(i+1).
[out]UU 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]LDULDU 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]VTVT 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]LDVTLDVT 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]WORKWORK is REAL array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK;
[in]LWORKLWORK 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]IWORKIWORK is INTEGER array, dimension (8*min(M,N))
Returns
= 0: successful exit.
< 0: if INFO = -i, the i-th argument had an illegal value.
> 0: SBDSDC did not converge, updating process failed.

Definition at line 718 of file templateLapack.hpp.

Referenced by eigenGESDD().

◆ gesvd()

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.

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.

Template Parameters
dataTis the data type of the arrays, and determines which underlying Lapack routine is called.
Parameters
[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'.

Parameters
[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):
  • PATH 1 (M much larger than N, JOBU='N')
  • PATH 1t (N much larger than M, JOBVT='N') LWORK >= MAX(1,3*MIN(M,N)+MAX(M,N),5*MIN(M,N)) for the other paths For good performance, LWORK should generally be larger.

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.

Returns
=0: successful exit.
<0: if INFO = -i, the i-th argument had an illegal value.
>0: if SBDSQR did not converge, INFO specifies how many superdiagonals of an MXLAPACK_INTermediate bidiagonal form B did not converge to zero. See the description of WORK above for details.

Definition at line 524 of file templateLapack.hpp.

◆ laed9()

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.

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}. \]

Template Parameters
dataTFloating-point type; supported specializations are float and double.
Returns
the value of INFO from the LAPACK routine
Parameters
[out]DN-element array of selected updated eigenvalues
[out]QLDQ-by-N secular-equation workspace produced by LAPACK
[out]SLDS-by-K updated eigenvectors, stored column-wise
[in]Knumber of terms in the secular equation
[in]KSTARTfirst updated eigenvalue to compute, inclusive and one-based
[in]KSTOPlast updated eigenvalue to compute, inclusive and one-based
[in]NQ matrix dimension, at least K
[in]LDQleading dimension of Q, at least max(1,N)
[in]RHOpositive rank-one update weight
[in]DLAMDAK-element array of strictly increasing diagonal poles
[in,out]WK deflation-adjusted update components
[in]LDSleading 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().

◆ lamch()

template<typename dataT>
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.

  • Template Parameters
    dataTis the data type of the arrays, and determines which underlying Lapack routine is called.
    Parameters
    [in]CMACHSpecifies 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)
    
    Returns
    the value of the specified machine parameters for the specified precision

Definition at line 104 of file templateLapack.hpp.

Referenced by eigenSYEVR(), and TEST_CASE().

◆ syevr()

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.

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.

◆ sytrd()

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.

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

Template Parameters
dataTis the data type
Parameters
UPLO'U': Upper triangle of A is stored, 'L': Lower triangle of A is stored.
NThe order of the matrix A. N >= 0.
Aarray, dimension (LDA,N)
LDAThe 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
Returns
the value of INFO from the LAPACK routine

Definition at line 183 of file templateLapack.hpp.