HDK
|
#include <UT_MatrixSolver.h>
Public Member Functions | |
int | LUDecompOld (UT_MatrixT< T > &a, UT_Permutation &index, T &d, T tol=1e-20) |
template<typename S > | |
void | LUBackSubOld (const UT_MatrixT< T > &a, const UT_Permutation &index, UT_VectorT< S > &b) |
int | LUDecomp (UT_MatrixT< T > &a, UT_Permutation &index, T &d, T tol=1e-20) |
template<typename S > | |
void | LUBackSub (const UT_MatrixT< T > &a, const UT_Permutation &index, UT_VectorT< S > &b) |
int | LUDecompRect (UT_MatrixT< T > &A, UT_Permutation &pivots, T &detsign, T tol=1e-6) |
template<typename S > | |
void | LUDecompBackSub (const UT_MatrixT< T > &A, const UT_Permutation &pivots, UT_VectorT< S > &b) |
int | LUDecompCompanion (const UT_MatrixT< T > &P, T a, T b, UT_MatrixT< T > &R, UT_Permutation &index, T tol=1e-20) |
template<typename S > | |
void | LUBackSubCompanion (const UT_MatrixT< T > &R, T a, T b, const UT_Permutation &index, UT_VectorT< S > &y) |
template<typename S > | |
int | choleskyDecomp (UT_MatrixT< T > &a, UT_VectorT< S > &d, T tol=1e-5) |
template<typename S > | |
int | choleskyBackSub (const UT_MatrixT< T > &a, const UT_VectorT< S > &d, const UT_VectorT< S > &b, UT_VectorT< S > &x, T tol=1e-5) |
template<typename S > | |
int | inversePowerIterate (const UT_MatrixT< T > &C1, const UT_MatrixT< T > &C2, UT_MatrixT< T > &R, UT_MatrixT< T > &tmp, UT_Permutation &index, T s, T &s1, T &s2, UT_VectorT< S > &q, UT_VectorT< S > &Aq, T starttol=1e-2, int startiter=5, T finaltol=1e-5, T doubletol=1e-4, int finaliter=50) |
void | inverse (UT_MatrixT< T > &a, UT_Permutation &index, UT_MatrixT< T > &ia) |
int | findLinIndRows (UT_MatrixT< T > &A, UT_Permutation &index, T tol=1E-6) |
void | fullGaussianElimination (UT_MatrixT< T > &G, UT_MatrixT< T > &Gu, UT_MatrixT< T > &Gv, UT_Permutation &rowperm, UT_Permutation &colperm, T &detsign) |
void | detWithPartials (const UT_MatrixT< T > &G, const UT_MatrixT< T > &Gu, const UT_MatrixT< T > &Gv, const UT_Permutation &rowperm, const UT_Permutation &colperm, T detsign, T &retdet, T &detu, T &detv) |
T | det (UT_MatrixT< T > &a, T d) |
T | det3x3 (const UT_MatrixT< T > &A, const UT_MatrixT< T > &B, const UT_MatrixT< T > &C, int p, int q, int r, int s, int t, int u) |
template<typename S > | |
void | condEstimate (const UT_MatrixT< T > &A, UT_VectorT< S > &y) |
Estimates condtion number of upper triangular matrix: More... | |
T | getConditionLUD (const UT_MatrixT< T > &A, const UT_Permutation &index, T anorm) |
template<typename S > | |
void | house (const UT_VectorT< S > &x, UT_VectorT< S > &v, T &b) |
Find householder vector of x. More... | |
template<typename S > | |
void | house (const UT_MatrixT< T > &x, UT_VectorT< S > &v, T &b) |
void | findGivens (T a, T b, T &c, T &s, T zerotol=1e-20) |
Finds the givens rotation required to 0 b: More... | |
int | findHalfGivens (const UT_MatrixT< T > &A, T &c, T &s, T tol=0.0) |
void | triangularize (UT_MatrixT< T > &A, UT_MatrixT< T > &B, UT_MatrixT< T > *Q=0) |
void | hessentri (UT_MatrixT< T > &A, UT_MatrixT< T > &B) |
Transforms A into upper hessenburg and B into upper triangular. More... | |
int | realSchurFormQZ (UT_MatrixT< T > &oA, UT_MatrixT< T > &oB, T tol=1e-6, int maxIteration=30) |
void | hessenberg (UT_MatrixT< T > &A) |
void | hessenberg (UT_MatrixT< T > &A, UT_MatrixT< T > &P) |
Computes P st A' = P^T A P. More... | |
int | bidiagonalize (UT_MatrixT< T > &A) |
Transforms A into a bidiagonal matrix via householder transformations. More... | |
int | realSchurForm (UT_MatrixT< T > &A, UT_MatrixT< T > *Q=0, T tol=1E-6, int maxIteration=30) |
int | gkSVD (UT_MatrixT< T > &A, T tol=1e-6, int maxIteration=30) |
template<typename S > | |
int | SVDDecomp (UT_MatrixT< T > &a, UT_VectorT< S > &w, UT_MatrixT< T > &v, int maxIterstion=30) |
template<typename S > | |
int | SVDBackSub (UT_MatrixT< T > &u, UT_VectorT< S > &w, UT_MatrixT< T > &v, UT_VectorT< S > &b, UT_VectorT< S > &x, T tol=1e-6) |
template<typename S > | |
void | findEigenValues (const UT_MatrixT< T > &A, UT_VectorT< S > &vreal, UT_VectorT< S > &vimg) |
Finds eigenvalues from a real schur form matrix: More... | |
template<typename S > | |
void | findEigenValues (const UT_MatrixT< T > &A, const UT_MatrixT< T > &B, UT_VectorT< S > &sreal, UT_VectorT< S > &simg, UT_VectorT< S > &treal, UT_VectorT< S > &timg) |
Finds eigenvalues from generalized system (A - lambdaB) More... | |
template<typename S > | |
int | findUVfromEigenvector (const UT_VectorT< S > &vect, int udeg, int vdeg, int tdeg, T &u, T &v) |
template<typename S > | |
void | findRightEigenVector (const UT_MatrixT< T > &A, const UT_MatrixT< T > &Q, UT_VectorT< S > &vector, int i) |
Definition at line 28 of file UT_MatrixSolver.h.
int UT_MatrixSolverT< T >::bidiagonalize | ( | UT_MatrixT< T > & | A | ) |
Transforms A into a bidiagonal matrix via householder transformations.
int UT_MatrixSolverT< T >::choleskyBackSub | ( | const UT_MatrixT< T > & | a, |
const UT_VectorT< S > & | d, | ||
const UT_VectorT< S > & | b, | ||
UT_VectorT< S > & | x, | ||
T | tol = 1e-5 |
||
) |
Solves the set of n linear equations, A.x = b, where a is a nonnegative definite symmetric matrix. Input: a[1..n][1..n] and d[1..n] as output from choleskyDecomp() above. Only the lower triangle of a is read from. b[1..n] is the right-hand side of A.x = b to solve for tol is the tolerance check for when an element of d is deemed 0 Output: x[1..n], the solution of A.x = b Returns the number of articial zero's placed into x.
int UT_MatrixSolverT< T >::choleskyDecomp | ( | UT_MatrixT< T > & | a, |
UT_VectorT< S > & | d, | ||
T | tol = 1e-5 |
||
) |
Cholesky factorization
To solve a full rank system A . x = b where A can be undertermined (ie. A has less rows than columns), we can make use of the Cholesky factorization functions below by way of the normal equations like so:
void UT_MatrixSolverT< T >::condEstimate | ( | const UT_MatrixT< T > & | A, |
UT_VectorT< S > & | y | ||
) |
Estimates condtion number of upper triangular matrix:
T UT_MatrixSolverT< T >::det | ( | UT_MatrixT< T > & | a, |
T | d | ||
) |
Compute the determinant of a LU decomposed matrix. The d is what one gets from LU decomposition.
|
inline |
Find the determiment: (A(p,q), B(r,s), C(t,u)))
Definition at line 255 of file UT_MatrixSolver.h.
void UT_MatrixSolverT< T >::detWithPartials | ( | const UT_MatrixT< T > & | G, |
const UT_MatrixT< T > & | Gu, | ||
const UT_MatrixT< T > & | Gv, | ||
const UT_Permutation & | rowperm, | ||
const UT_Permutation & | colperm, | ||
T | detsign, | ||
T & | retdet, | ||
T & | detu, | ||
T & | detv | ||
) |
After full Gaussian Elimination, this finds the determinant and partials thereof:
void UT_MatrixSolverT< T >::findEigenValues | ( | const UT_MatrixT< T > & | A, |
UT_VectorT< S > & | vreal, | ||
UT_VectorT< S > & | vimg | ||
) |
Finds eigenvalues from a real schur form matrix:
void UT_MatrixSolverT< T >::findEigenValues | ( | const UT_MatrixT< T > & | A, |
const UT_MatrixT< T > & | B, | ||
UT_VectorT< S > & | sreal, | ||
UT_VectorT< S > & | simg, | ||
UT_VectorT< S > & | treal, | ||
UT_VectorT< S > & | timg | ||
) |
Finds eigenvalues from generalized system (A - lambdaB)
void UT_MatrixSolverT< T >::findGivens | ( | T | a, |
T | b, | ||
T & | c, | ||
T & | s, | ||
T | zerotol = 1e-20 |
||
) |
Finds the givens rotation required to 0 b:
int UT_MatrixSolverT< T >::findHalfGivens | ( | const UT_MatrixT< T > & | A, |
T & | c, | ||
T & | s, | ||
T | tol = 0.0 |
||
) |
Find half givens, return 0 if success, otherwise the required rotation is impossible (ie:complex eigenvalue)
int UT_MatrixSolverT< T >::findLinIndRows | ( | UT_MatrixT< T > & | A, |
UT_Permutation & | index, | ||
T | tol = 1E-6 |
||
) |
Finds all linearly independent rows in A, does NOT require A to be any particular shape. Returns the number of independent rows & first entries of index are their indices in the original matrix. Destroys A.
void UT_MatrixSolverT< T >::findRightEigenVector | ( | const UT_MatrixT< T > & | A, |
const UT_MatrixT< T > & | Q, | ||
UT_VectorT< S > & | vector, | ||
int | i | ||
) |
Finds a specified eigenvector from a real schur form matrix. The eigenvector must be real!
int UT_MatrixSolverT< T >::findUVfromEigenvector | ( | const UT_VectorT< S > & | vect, |
int | udeg, | ||
int | vdeg, | ||
int | tdeg, | ||
T & | u, | ||
T & | v | ||
) |
Finds the u & v eigenvalues from an eigenvector, whose udeg, vdeg, and tdeg are as specified. Returns 0 if fails. NB: Does the s/(1+s) transformation!
void UT_MatrixSolverT< T >::fullGaussianElimination | ( | UT_MatrixT< T > & | G, |
UT_MatrixT< T > & | Gu, | ||
UT_MatrixT< T > & | Gv, | ||
UT_Permutation & | rowperm, | ||
UT_Permutation & | colperm, | ||
T & | detsign | ||
) |
Similar to findLinIndRows, performs gaussian elimination with full pivoting on G. Updates as well Gu, and Gv, the partial derivitive matrix of G(u, v). After this is done, the determinant of G & partials of the determinant can be computed.
T UT_MatrixSolverT< T >::getConditionLUD | ( | const UT_MatrixT< T > & | A, |
const UT_Permutation & | index, | ||
T | anorm | ||
) |
Finds the condition number of a LUDecomposed matrix. This is just an approximation You must provide the infinite norm of A before LUDecomposition.
int UT_MatrixSolverT< T >::gkSVD | ( | UT_MatrixT< T > & | A, |
T | tol = 1e-6 , |
||
int | maxIteration = 30 |
||
) |
Golub-Kahan SVD algorithm. Resulting SVD matrix found in diaganol of A.
void UT_MatrixSolverT< T >::hessenberg | ( | UT_MatrixT< T > & | A | ) |
Transform A into a hessenberg matrix through a series of householder reflections.
void UT_MatrixSolverT< T >::hessenberg | ( | UT_MatrixT< T > & | A, |
UT_MatrixT< T > & | P | ||
) |
Computes P st A' = P^T A P.
void UT_MatrixSolverT< T >::hessentri | ( | UT_MatrixT< T > & | A, |
UT_MatrixT< T > & | B | ||
) |
Transforms A into upper hessenburg and B into upper triangular.
void UT_MatrixSolverT< T >::house | ( | const UT_VectorT< S > & | x, |
UT_VectorT< S > & | v, | ||
T & | b | ||
) |
Find householder vector of x.
void UT_MatrixSolverT< T >::house | ( | const UT_MatrixT< T > & | x, |
UT_VectorT< S > & | v, | ||
T & | b | ||
) |
void UT_MatrixSolverT< T >::inverse | ( | UT_MatrixT< T > & | a, |
UT_Permutation & | index, | ||
UT_MatrixT< T > & | ia | ||
) |
Compute the inverse of a LU decomposed matrix. If you want to solve systems of equations AX=B, where B is a matrix. It is better (faster) to do a LU decomposition and use back substituation for columns of B.
int UT_MatrixSolverT< T >::inversePowerIterate | ( | const UT_MatrixT< T > & | C1, |
const UT_MatrixT< T > & | C2, | ||
UT_MatrixT< T > & | R, | ||
UT_MatrixT< T > & | tmp, | ||
UT_Permutation & | index, | ||
T | s, | ||
T & | s1, | ||
T & | s2, | ||
UT_VectorT< S > & | q, | ||
UT_VectorT< S > & | Aq, | ||
T | starttol = 1e-2 , |
||
int | startiter = 5 , |
||
T | finaltol = 1e-5 , |
||
T | doubletol = 1e-4 , |
||
int | finaliter = 50 |
||
) |
Performs inverse iteration to find the closest eigenvalue(s) to s. Does a two pass method, first using single iterations until starttol is reached, in which case singles are used to achieve final tolerance. If starttol is not reached in startiter iterations, uses double method to find using final tolerance/iterations.
The vector q is updated with the newest eigenvector. Source matrices are: [1 0 0] [0 1 0] C1' = [0 1 0] C2' = [0 0 1] [0 0 C1] [ C2 ] Thus, the initial sizes of the matrices/vectors are (row*col): C1: n*n, C2: n*(n*deg), R: n*(n*deg), tmp: n*(n*deg), index: n, q: n*deg, Aq: n*deg The result code determines how s1 & s2 are to be interpreted: Result: 0 - One eigenvalue found at s1, eigenvector q. 1 - Two real eigenvalues found: s1 & s2. 2 - Complex conjugate eigenvalues found: s1 +- s2i. -1 - Failed to converge to final tolerance using single method. -2 - Failed to converge to final tolerance using double method.
|
inline |
Definition at line 70 of file UT_MatrixSolver.h.
void UT_MatrixSolverT< T >::LUBackSubCompanion | ( | const UT_MatrixT< T > & | R, |
T | a, | ||
T | b, | ||
const UT_Permutation & | index, | ||
UT_VectorT< S > & | y | ||
) |
This takes the result of the previous operation and does a back substitution.
void UT_MatrixSolverT< T >::LUBackSubOld | ( | const UT_MatrixT< T > & | a, |
const UT_Permutation & | index, | ||
UT_VectorT< S > & | b | ||
) |
Solve Ax=b a[1..n][1..n] is a LU Decomposition of matrix A (eg. from LUDecomp()) index describes the row permutations as output from LUDecomp() b[1..n] is input as rhs, and on output contains the solution x
|
inline |
Definition at line 64 of file UT_MatrixSolver.h.
void UT_MatrixSolverT< T >::LUDecompBackSub | ( | const UT_MatrixT< T > & | A, |
const UT_Permutation & | pivots, | ||
UT_VectorT< S > & | b | ||
) |
Performs back substitution using the output of LUDecomp() for a square matrix. Input: A[1..n][1..n] and pivots as output from LUDecompRect() b[1..n] is the right hand side for solving A.x = b Output: b is modified to contain the solution x
int UT_MatrixSolverT< T >::LUDecompCompanion | ( | const UT_MatrixT< T > & | P, |
T | a, | ||
T | b, | ||
UT_MatrixT< T > & | R, | ||
UT_Permutation & | index, | ||
T | tol = 1e-20 |
||
) |
LU decompose a companion matrix The matrix given is the base of the companion matrix: [aI bI 0 0 ] [0 aI bI 0 ] [0 0 aI bI] [P1 P2 P3 P4] ie: [P1 P2 P3 P4] The resulting LU decompostion is written into the R matrix and is: [aI 0 0 0] [I b/aI 0 0 ] [0 aI 0 0] [0 I b/aI 0 ] [0 0 aI 0] [0 0 I b/aI] [R1 R2 R3 L] [0 0 0 U ] LU is stored in the last portion of the matrix & index is the permuation that resulted in it. Thus, index should be the height of P, NOT the entire companion matrix.
Return 0 on success, -1 for singular, and -2 for singular to machine precision (As judged by tol), and -3 for a being near zero.
int UT_MatrixSolverT< T >::LUDecompOld | ( | UT_MatrixT< T > & | a, |
UT_Permutation & | index, | ||
T & | d, | ||
T | tol = 1e-20 |
||
) |
LU Decomposition of a[1..n][1..n] where a has full rank. Output: index[1..n] is the row permutation d = +/-1 indicating row interchanges was even or odd, resp. return 0 if the matrix is truly singular 1 on success 2 if the matrix is singular to the precision of the algorithm, where tol is the zero tolerance.
int UT_MatrixSolverT< T >::LUDecompRect | ( | UT_MatrixT< T > & | A, |
UT_Permutation & | pivots, | ||
T & | detsign, | ||
T | tol = 1e-6 |
||
) |
LU decomposition of rectangular A[1..m][1..n] with partial pivoting. Unlike LUDecomp(), this handles pivot values of 0. ie. it performs the decomposition of A = P.L.U for unit lower triangular L and upper triangular U. Input: A[1..m][1..n] Output: A contains the matrices L and U in compact form, without the unit diagonal. L is of size min(m,n) by n. U is of size m by min(m,n) pivots[1..n] is the row permulation P tol is scaled by the largest pivot element detsign is the sign of the determinant used by det() its +1 if row interchanges was even, -1 if odd Returns 0 if the matrix is truly singular 1 on success 2 if the matrix is singular to the precision of the algorithm, where tol is the zero tolerance. This algorithm takes roughly O(m*n^2 - n^3/3) flops
int UT_MatrixSolverT< T >::realSchurForm | ( | UT_MatrixT< T > & | A, |
UT_MatrixT< T > * | Q = 0 , |
||
T | tol = 1E-6 , |
||
int | maxIteration = 30 |
||
) |
Reduces the matrix to real Schur form: Orthogonal transform responible for getting to real schur form is accumulated in Q, if it is non-zero.
int UT_MatrixSolverT< T >::realSchurFormQZ | ( | UT_MatrixT< T > & | oA, |
UT_MatrixT< T > & | oB, | ||
T | tol = 1e-6 , |
||
int | maxIteration = 30 |
||
) |
Converts A into quasi upper triangular & B into upper triangular form using the QZ algorithm.
int UT_MatrixSolverT< T >::SVDBackSub | ( | UT_MatrixT< T > & | u, |
UT_VectorT< S > & | w, | ||
UT_MatrixT< T > & | v, | ||
UT_VectorT< S > & | b, | ||
UT_VectorT< S > & | x, | ||
T | tol = 1e-6 |
||
) |
Perform back substitution on an SVD decomposed matrix. Solves equation Ax = b.
int UT_MatrixSolverT< T >::SVDDecomp | ( | UT_MatrixT< T > & | a, |
UT_VectorT< S > & | w, | ||
UT_MatrixT< T > & | v, | ||
int | maxIterstion = 30 |
||
) |
Use Numerical Recipes method for SVD decomposition, with results that are suitable for doing back substitution. NOTE: The UT_MatrixF should start with 1,1!
Decomposition a = u * w * v^T a[1..m][1..n] also stores the result u[1..m][1..n] w[1..n][1..n] is a diagonal matrix, stored as a vector v[1..n][1..n]
void UT_MatrixSolverT< T >::triangularize | ( | UT_MatrixT< T > & | A, |
UT_MatrixT< T > & | B, | ||
UT_MatrixT< T > * | Q = 0 |
||
) |
Upper triangulizes A with householder transforms, applying simultaneously to A and optionally Q.