Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#if !defined(LAPACKFUNC_H_HAA_AGUST_2001)
2
#define LAPACKFUNC_H_HAA_AGUST_2001
3
 
4
#if defined(_MSC_VER)
5
#pragma message("Note: including lib: clapack.lib\n")
6
#pragma comment(lib, "clapack.lib")
7
 
8
#endif
9
 
10
#include "Matrix.h"
11
#include "Vector.h"
12
 
13
namespace LinAlg
14
{
15
 
16
/*!
17
\file LapackFunc.h
18
\brief Interface to some of the LAPACK functionality.
19
 
20
These are functions which more or less directly interface with the
21
Lapack provided algorithms.
22
 
23
For indepth reference to the LAPACK functions see:
24
  LAPACK Users' Guide - 3rd Edition,
25
  by E. Anderson et al.,
26
  ISBN 0-89871-447-8,
27
  Published by SIAM,
28
 
29
This book is also available at: \URL{http://www.netlib.org/lapack/lug/lapack_lug.html}
30
 
31
The official LAPACK sites where from the source can be downloaded are:
32
  \URL{http://www.netlib.org/clapack/} and
33
  \URL{http://www.netlib.org/lapack/}
34
 
35
 
36
NB: When running this in MS Visual C++ it is usually required to set the 
37
multithread "\MD" compiler option. This is to ensure correct linkage to the 
38
precompiled library "clapack.lib" and/or "clapackDB.lib".
39
 
40
 
41
\author  Henrik Aanęs
42
\version Aug 2001
43
*/
44
 
45
/*!
46
\name Singular Value Decomposition SVD 
47
 
48
These functions perform the Singular Value Decomposition SVD of 
49
the MxN matrix A. The SVD is defined by:
50
 
51
  A=U*S*V^T
52
 
53
where:
54
- U is a M by M orthogonal matrix 
55
- V is a N by N orthogonal matrix 
56
- S is a M by N diaggonal matrix. The values in the diagonal are the singular values
57
 
58
 
59
\param  A the matrix to perform SVD on  
60
\return U will be resized if it is does not have the correct dimensions
61
\return V will be resized if it is does not have the correct dimensions
62
\return S will be resized if it is does not have the correct dimensions. 
63
\exception assert(info==0) for Lapack. Add a throw statement later.
64
\version  Aug 2001 
65
\author  Henrik Aanęs
66
*/  
67
//@{ 
68
///SVD of A, where the singular values are returned in a Vector.
69
void SVD(const CMatrix& A,CMatrix& U,CVector& s,CMatrix& V);
70
///SVD of A, where the singular values are returned in a 'diagonal' Matrix.
71
void SVD(const CMatrix& A,CMatrix& U,CMatrix& S,CMatrix& V);
72
///SVD of A, returning only the singular values in a Vector.
73
CVector SVD(const CMatrix& A);
74
//@}
75
 
76
 
77
/*!
78
\name Linear Equations
79
These functions solve the system of linear equations
80
 
81
  A*x=b 
82
 
83
for x, where:
84
- A is a N by N matrix 
85
- b is a N vector
86
- x is a N vector
87
 
88
There a speceilaized functions for symetric positive definite (SPD) 
89
matrices yeilding better performance. These are denote by SPD in 
90
there function name.
91
 
92
\param A the NxN square matrix
93
\param b the N vector
94
\return x will be resized if it is does not have the correct dimensions
95
\exception assert(info==0) for Lapack. Add a throw statement later.
96
\exception assert(A.Row()==A.Col()). Add a throw statement later.
97
\exception assert(A.Row()==b.Length()). Add a throw statement later.
98
\version  Aug 2001 
99
\author  Henrik Aanęs
100
*/  
101
//@{
102
///Solves Ax=b for x.
103
void LinearSolve(const CMatrix& A,const CVector&b,CVector& x);
104
///Solves Ax=b for x and returns x.
105
CVector LinearSolve(const CMatrix& A,const CVector&b);
106
///Solves Ax=b for x, where A is SPD.
107
void LinearSolveSPD(const CMatrix& A,const CVector&b,CVector& x);
108
///Solves Ax=b for x and returns x, where A is SPD.
109
CVector LinearSolveSPD(const CMatrix& A,const CVector&b);
110
//@}
111
 
112
void LinearSolveSym(const CMatrix& A,
113
										const CVector&b,
114
										CVector& x);
115
 
116
/**
117
\name Linear Least Squares
118
These functions solve the Linear Least Squares problem:
119
 
120
  min_x ||Ax-b||^2
121
 
122
for x, where:
123
- || || denotes the 2-norm
124
- A	is a M by N matrix. For a well formed M>=N and rank (A)=N. See below.
125
- b	is a M vector.
126
- x	is a N vector 
127
 
128
If the solution is not \em well \em formed the algorithm provided will find a
129
solution, x, which is not unique, but which sets the objective function
130
to 0. The reson being that the underlining algorithm works by SVD.
131
 
132
\param A the MxN matrix
133
\param b the M vector
134
\return x will be resized if it is does not have the correct dimensions
135
\exception assert(info==0) for Lapack. Add a throw statement later.
136
\exception assert(A.Rows()==b.Length());. Add a throw statement later.
137
\version  Aug 2001 
138
\author  Henrik Aanęs
139
*/  
140
//@{
141
///Solves the Linear Least Squares problem min_x ||Ax=b||^2 for x.
142
void LinearLSSolve(const CMatrix& A,const CVector&b,CVector& x);
143
///Solves the Linear Least Squares problem min_x ||Ax=b||^2 for x, and returnes x.
144
CVector LinearLSSolve(const CMatrix& A,const CVector&b);
145
//@}
146
 
147
/**
148
\name Matrix Inversion
149
These functions inverts the square matrix A. This matrix A must have
150
full rank. 
151
\param A square matrix
152
\return InvA the invers of A for one instance.
153
\exception assert(info==0) for Lapack. This wil among others happen if A is rank deficient. Add a throw statement later. 
154
\exception assert(A.Rows()==A.Cols()). Add a throw statement later.
155
\version  Aug 2001 
156
\author  Henrik Aanęs
157
*/  
158
//@{
159
///Invertes the square matrix A. That is here A is altered as opposed to the other Invert functions.
160
void Invert(CMatrix& A);
161
/// Returns the inverse of the square matrix A in InvA.
162
void Inverted(const CMatrix& A,CMatrix& InvA);
163
/// Returns the inverse of the square matrix A.
164
CMatrix Inverted(const CMatrix& A);
165
//@}
166
 
167
 
168
/**
169
\name QR Factorization
170
This function returns the QR factorization of A, such that Q*R=A where 
171
Q is a orthonormal matrix and R is an upper triangular matrix. However, 
172
in the case of A.Col()>A.Row(), the last A.Col-A.Row columns of Q are 
173
'carbage' and as such not part of a orthonormal matrix.
174
 \param A  the input matrix
175
\return Q an orthonormal matrix. (See above)
176
\return R an upper triangular matrix.
177
\exception assert(info==0) for Lapack. This wil among others happen if A is rank deficient. Add a throw statement later. 
178
\exception assert(A.Rows()>0 && A.Cols()>0). Add a throw statement later.
179
\version  Aug 2001 
180
\author  Henrik Aanęs
181
*/ 
182
//@{ 
183
void QRfact(const CMatrix& A,CMatrix& Q, CMatrix& R);
184
//@}
185
 
186
 
187
/**
188
\name RQ Factorization
189
This function returns the RQ factorization of A, such that R*Q=A where 
190
Q is a orthonormal matrix and R is an upper triangular matrix. However, 
191
in the case of A not beeing a square matrix, there might be some fuck up of Q.
192
 \param A  the input matrix
193
\return Q an orthonormal matrix. (See above)
194
\return R an upper triangular matrix.
195
\exception assert(info==0) for Lapack. This wil among others happen if A is rank deficient. Add a throw statement later. 
196
\exception assert(A.Rows()>0 && A.Cols()>0). Add a throw statement later.
197
\version  Aug 2001 
198
\author  Henrik Aanęs
199
*/ 
200
//@{ 
201
void RQfact(const CMatrix& A,CMatrix& R, CMatrix& Q);
202
//@}
203
 
204
}
205
 
206
#endif // !defined(LAPACKFUNC_H_HAA_AGUST_2001)