TBCI Numerical high perf. C++ Library 2.8.0
gauss_jordan.h
Go to the documentation of this file.
1
11
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
33INST(template <typename T> class Matrix friend char gaussj (Matrix<T>&, Matrix<T>&);)
34
45template <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 */
const Vector< T > const Vector< T > const Vector< T > int T T & err
Definition LM_fit.h:102
int i
Definition LM_fit.h:71
#define STD__
Definition basics.h:338
#define BCHK(cond, exc, txt, ind, rtval)
Definition basics.h:575
#define NAMESPACE_END
Definition basics.h:323
#define INST(x)
Definition basics.h:238
#define NAMESPACE_TBCI
Definition basics.h:317
#define REGISTER
Definition basics.h:108
#define MATH__
Definition basics.h:339
#define T
Definition bdmatlib.cc:20
provides basic Vector functionality but arithmetic operators (+=, - , *, /...).
Definition bvector.h:68
exception class
Definition matrix.h:54
double fabs(const TBCI__ cplx< T > &c)
Definition cplx.h:746
F_TMatrix< T > b
Definition f_matrix.h:736
NAMESPACE_TBCI char gaussj(Matrix< T > &a, Matrix< T > &b)
#define HVAL
#define GJ_MINVAL
const unsigned TMatrix< T > const Matrix< T > * a