28 using std::setprecision;
39 const std::vector< double >& y )
44 z.resize( nrows, 0.0 );
46 for (
int i = 0;
i < nrows;
i++)
54 const std::vector< double >& y )
59 z.resize( nrows, 0.0 );
61 for (
int i = 0;
i < nrows;
i++)
73 z.resize( nrows, 0.0 );
75 for (
int i = 0;
i < nrows;
i++ )
81 std::vector< vector< double > >
82 operator + (
const std::vector< std::vector< double > >&A,
83 const std::vector< std::vector< double > >&B )
86 int ncols = A[0].size();
88 vector< vector< double > > C( nrows );
89 for(
int i = 0;
i < nrows;
i++ )
90 C[
i].resize( ncols, 0.0 );
92 for (
int i = 0;
i < nrows;
i++)
93 for (
int j = 0; j < ncols; j++)
94 C[
i][j] = A[
i][j] + B[
i][j];
99 std::vector< vector< double > >
101 const std::vector< std::vector< double > >&B )
103 int nrows = A.size();
104 int ncols = A[0].size();
106 vector< vector< double > > C( nrows );
107 for(
int i = 0;
i < nrows;
i++ )
108 C[
i].resize( ncols, 0.0 );
110 for (
int i = 0;
i < nrows;
i++)
111 for (
int j = 0; j < ncols; j++)
112 C[
i][j] = A[
i][j] - B[
i][j];
118 std::vector< double >
121 int nrows = x.size();
124 y.resize( nrows, 0.0 );
126 for (
int i = 0;
i < nrows;
i++)
132 std::vector< double >
135 int nrows = x.size();
138 assert( abs( a ) > DBL_EPSILON );
140 y.resize( nrows, 0.0 );
142 for (
int i = 0;
i < nrows;
i++)
148 std::vector< std::vector< double > >
149 operator * (
double a,
const std::vector< std::vector< double > >&A )
151 int nrows = A.size();
152 int ncols = A[0].size();
154 vector< vector< double > > B( nrows );
155 for(
int i = 0;
i < nrows;
i++ )
156 B[
i].resize( ncols, 0.0 );
158 for (
int i = 0;
i < nrows;
i++)
159 for (
int j = 0; j < ncols; j++)
160 B[
i][j] = a * A[
i][j];
165 std::vector< std::vector< double > >
166 operator / (
const std::vector< std::vector< double > >& A,
double a )
168 int nrows = A.size();
169 int ncols = A[0].size();
171 assert( abs( a ) > DBL_EPSILON );
173 vector< vector< double > > B( nrows );
174 for(
int i = 0;
i < nrows;
i++ )
175 B[
i].resize( ncols, 0.0 );
177 for (
int i = 0;
i < nrows;
i++)
178 for (
int j = 0; j < ncols; j++)
184 std::vector< double >
186 const std::vector< double >& x )
188 int nrows = A.size();
189 int ncols = A[0].size();
192 y.resize( nrows, 0.0 );
194 for (
int i = 0;
i < nrows;
i++)
195 for (
int j = 0; j < ncols; j++)
196 y[
i] += A[
i][j] * x[j];
201 std::vector< double >
203 const std::vector< std::vector< double > >& A )
205 int nrows = A.size();
206 int ncols = A[0].size();
209 y.resize( ncols, 0.0 );
211 for (
int j = 0; j < ncols; j++)
212 for (
int i = 0;
i < nrows;
i++)
213 y[j] += A[
i][j] * x[
i];
218 std::vector< vector< double > >
220 const std::vector< std::vector< double > >&B )
226 vector< vector< double > > C( m );
227 for(
int i = 0;
i < m;
i++ )
228 C[
i].resize( n, 0.0 );
230 for (
int i = 0;
i < m;
i++)
231 for (
int j = 0; j < n; j++)
232 for (
int k = 0; k < r; k++)
233 C[
i][j] += A[
i][k] * B[k][j];
240 const std::vector< double > & b )
244 for (
unsigned int i = 0;
i < a.size();
i++ )
251 vector< vector< double > >
253 const std::vector< double >& b )
255 vector< vector< double> > C( a.size() );
256 for(
unsigned int i = 0;
i < a.size();
i++ )
257 C[
i].resize( b.size() );
259 for(
unsigned int i = 0;
i < a.size();
i++ )
260 for(
unsigned int j = 0; j < b.size(); j++ )
261 C[
i][j] = a[
i] * b[j];
269 const std::vector< double > x )
272 unsigned int n = A.size();
274 assert ( x.size() == n );
276 for (
unsigned int i = 0;
i < n;
i++ )
277 for (
unsigned int j = 0; j < n; j++ )
278 prod += x[
i] * A[
i][j] * x[j];
285 norm (
const std::vector< double > & a )
294 unsigned int n = A.size();
296 for (
unsigned int i = 0;
i < n ; ++
i )
297 for (
unsigned int j = 0; j <=
i ; ++j)
299 double sum = A[
i][j];
303 for (
unsigned int k = 0; k < j; ++k )
304 sum -= A[
i][k] * A[j][k];
308 if (sum < 0)
return EXIT_FAILURE;
312 if ( fabs(sum) < DBL_EPSILON )
return EXIT_FAILURE;
317 A[
i][j] = sum / A[j][j];
326 std::vector< double > & x,
327 const std::vector< double > & b )
329 unsigned int n = L.size();
334 for (
unsigned int i = 0;
i < n ;
i++)
337 for (
unsigned int j = 0; j <
i ; ++j)
338 sum -= x[j] * L[i][j];
339 x[
i] = sum / L[
i][
i];
343 for (
int i = n - 1;
i >= 0;
i-- )
346 for (
unsigned int j =
i + 1; j < n ; j++)
347 sum -= x[j] * L[j][
i];
348 x[
i] = sum / L[
i][
i];
357 std::vector < std::vector < double > > & Ainv )
359 unsigned int n = A.size();
360 vector< double > x, b;
361 vector< vector< double > > L;
370 for (
unsigned int i = 0;
i < n;
i++ )
373 L[
i].resize ( n, 0.0 );
376 Ainv[
i].resize ( n, 0.0 );
379 for (
unsigned int i = 0;
i < n;
i++ )
380 for (
unsigned int j = 0; j < n; j++ )
387 for (
unsigned int j = 0; j < n; j++ )
390 for (
unsigned int i = 0;
i < n;
i++ )
391 b[
i] = (
i == j ) ? 1 : 0;
397 for (
unsigned int i = 0;
i < n;
i++ )
405 eye ( std::vector < std::vector < double > >& I,
int n )
408 for(
int i = 0;
i < n;
i++ )
411 I[
i].resize( n, 0.0 );
414 for(
int i = 0;
i < n;
i++ )
421 write (
const std::vector < double > & a )
423 unsigned int n = a.size();
425 for (
unsigned int i = 0;
i < n; ++
i )
426 cout << setprecision( 15 ) << a[
i] << endl;
434 write (
const std::vector < std::vector < double > > & A )
436 unsigned int n = A.size();
438 for (
unsigned int i = 0;
i < n; ++
i )
440 for (
unsigned int j = 0; j < n; ++j )
441 cout << setw( 8 ) << setprecision( 4 ) << A[
i][j];
456 for(
int i = 0;
i < m;
i++ )
459 A[
i].resize( n, 0.0 );
std::vector< double > operator-(const std::vector< double > &x, const std::vector< double > &y)
Given two vectors x and y this function performs operation z = x - y.
Collection of linear algebra functions.
std::vector< double > operator+(const std::vector< double > &x, const std::vector< double > &y)
Given two vectors x and y this function performs operation z = x + y.
double innerProduct(const std::vector< double > &a, const std::vector< double > &b)
Computes the dot or the inner product of two vectors(i.e.
int allocateMatrix(std::vector< std::vector< double > > &A, int m, int n)
Allocates a matrix of size m x n.
int cholFactor(std::vector< std::vector< double > > &A)
The subroutine which does cholesky factorization of a given Symmetric positive definite matrix (say) ...
vector< vector< double > > outerProduct(const std::vector< double > &a, const std::vector< double > &b)
Computes the outer product of two vectors (i.e.
int cholBackSolve(const std::vector< std::vector< double > > &L, std::vector< double > &x, const std::vector< double > &b)
Solves the equation LL'x = b where L is lower triangular matrix.
int eye(std::vector< std::vector< double > > &I, int n)
Creates an n x n identity matrix for M.
std::vector< double > operator*(double a, const std::vector< double > &x)
Given a scalar a and a vector x this function performs operation y = ax.
int invertMatrix(const std::vector< std::vector< double > > &A, std::vector< std::vector< double > > &Ainv)
Inverts a SPD matrix a to get inverse Ainv using the cholesky factorization.
double quadraticProduct(const std::vector< std::vector< double > > &A, const std::vector< double > x)
Calculates the vector-matrix-vector product x'*A*x.
double norm(const std::vector< double > &a)
Computes the two norm of the vector.
std::vector< double > operator/(const std::vector< double > &x, double a)
Given a scalar and a vector x this function performs operation y = x/a.
int write(const std::vector< double > &a)
Given the vector it writes it to std stream.
int allocateVector(std::vector< double > &x, int n)
Allocates a vector of size n.