Subversion Repositories gelsvn

Rev

Rev 636 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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