TBCI Numerical high perf. C++ Library  2.8.0
gauss_jordan.h
Go to the documentation of this file.
1 
12 #ifndef TBCI_SOLVER_GAUSS_JORDAN_H
13 #define TBCI_SOLVER_GAUSS_JORDAN_H
14 
15 #include "tbci/basics.h"
16 #include "tbci/matrix.h"
17 
18 #ifdef PRAGMA_I
19 # pragma interface "gauss_jordan.h"
20 #endif
21 
22 #ifndef GJ_MINVAL
23 # define GJ_MINVAL 1e-16
24 #endif
25 
26 //include <huge_val.h>
27 #ifndef HVAL
28 # define HVAL 1e38
29 #endif
30 
32 
33 INST(template <typename T> class Matrix friend char gaussj (Matrix<T>&, Matrix<T>&);)
34 
45 template <typename T>
47 {
48  const int n = a.row, m = b.col;
49  char err = 0;
50 
51  BVector<unsigned> indxc((unsigned)n);
52  BVector<unsigned> indxr((unsigned)n);
53  BVector<unsigned> ipiv ((unsigned)0, n);
54 
55  BCHK(a.col != b.row, MatErr, Wrong sizes in gaussj, b.row, 1);
56 
57  for (int i = 0; i < n; ++i) {
58  double big = 0.0;
59  int icol = 0, irow = 0;
60  for (int j = 0; j < n; ++j)
61  if (ipiv(j) != 1)
62  for (REGISTER int k = 0; k < n; ++k) {
63  if (ipiv(k) == 0) {
64  if (MATH__ fabs(a(j, k)) >= MATH__ fabs(big)) {
65  big = MATH__ fabs(a(j, k));
66  irow = j; icol = k;
67  }
68  } else if (ipiv(k) > 1) {
69  STD__ cerr << "\n\n error: gaussj: singular Matrix-1 \n\n";
70  err |= 1;
71  }
72  }
73  ++(ipiv(icol));
74  if (irow != icol) {
75  for (REGISTER int l = 0; l < n; ++l)
76  SWAP(a(irow, l), a(icol, l));
77  for (REGISTER int z = 0; z < m; ++z)
78  SWAP(b(irow, z), b(icol, z));
79  }
80  indxr(i) = irow;
81  indxc(i) = icol;
82  T pivinv;
83  if (MATH__ fabs(a(icol, icol)) < GJ_MINVAL) {
84  STD__ cerr << "\n\n error: gaussj: singular Matrix-2 \n" << STD__ endl;
85  err |= 2; pivinv = (T)HVAL;
86  } else
87  pivinv = 1.0 / a(icol, icol);
88  a(icol, icol) = (T)1.0;
89  for (REGISTER int l = 0; l < n; ++l)
90  a(icol, l) *= pivinv;
91  for (REGISTER int z = 0; z < m; ++z)
92  b(icol, z) *= pivinv;
93  for (int ll = 0; ll < n; ++ll)
94  if (ll != icol) {
95  REGISTER T dum = a(ll, icol);
96  a(ll, icol) = (T)0.0;
97  for (REGISTER int v = 0; v < n; ++v)
98  a(ll, v) -= a(icol, v) * dum;
99  for (REGISTER int w = 0; w < m; ++w)
100  b(ll, w) -= b(icol, w) * dum;
101  }
102  }
103  for (int l = n-1; l >= 0; --l) {
104  if (indxr(l) != indxc(l))
105  for(REGISTER int k = 0; k < n; ++k)
106  SWAP(a(k, indxr(l)), a(k, indxc(l)));
107  }
108  return err;
109 }
110 
112 #endif /* TBCI_SOLVER_GAUSS_JORDAN_H */
#define GJ_MINVAL
Definition: gauss_jordan.h:23
#define REGISTER
Definition: basics.h:108
double fabs(const int a)
Definition: basics.h:1215
#define NAMESPACE_TBCI
Definition: basics.h:317
#define HVAL
Definition: gauss_jordan.h:28
NAMESPACE_TBCI char gaussj(Matrix< T > &a, Matrix< T > &b)
Definition: gauss_jordan.h:46
#define BCHK(cond, exc, txt, ind, rtval)
Definition: basics.h:575
unsigned int col
Definition: matrix.h:116
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & z
Definition: LM_fit.h:172
F_TMatrix< T > b
Definition: f_matrix.h:736
exception class
Definition: matrix.h:53
void SWAP(T &a, T &b)
SWAP function Note: We could implement a swap function without temporaries: a -= b b += a a -= b a = ...
Definition: basics.h:813
Definition: bvector.h:49
const Vector< T > const Vector< T > const Vector< T > int T T & err
Definition: LM_fit.h:102
#define INST(x)
Definition: basics.h:238
int i
Definition: LM_fit.h:71
#define STD__
Definition: basics.h:338
#define NAMESPACE_END
Definition: basics.h:323
#define T
Definition: bdmatlib.cc:20
const unsigned TMatrix< T > const Matrix< T > * a
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > long int int char v
&lt; find minimun of func on grid with resolution res
Definition: LM_fit.h:205
#define MATH__
Definition: basics.h:339
unsigned int row
Definition: matrix.h:116