30 #ifndef GAUSSIAN_ELIMINATION_H 31 #define GAUSSIAN_ELIMINATION_H 35 #include <TooN/TooN.h> 42 template<
int N,
typename Precision>
49 for (
int i=0; i<size; ++i) {
51 Precision maxval = abs(A[i][i]);
53 for (
int ii=i+1; ii<size; ++ii) {
54 double v = abs(A[ii][i]);
60 Precision pivot = A[argmax][i];
62 Precision inv_pivot =
static_cast<Precision
>(1)/pivot;
64 for (
int j=i; j<size; ++j)
65 swap(A[i][j], A[argmax][j]);
66 swap(b[i], b[argmax]);
69 for (
int j=i+1; j<size; ++j)
73 for (
int u=i+1; u<size; ++u) {
74 double factor = A[u][i];
76 for (
int j=i+1; j<size; ++j)
77 A[u][j] -= factor * A[i][j];
78 b[u] -= factor * b[i];
83 for (
int i=size-1; i>=0; --i) {
85 for (
int j=i+1; j<size; ++j)
86 x[i] -= A[i][j] * x[j];
93 template<
int i,
int j,
int k>
struct Size3 104 template<
int R1,
int C1,
int R2,
int C2,
typename Precision>
111 int size=A.num_rows();
113 for (
int i=0; i<size; ++i) {
115 Precision maxval = abs(A[i][i]);
117 for (
int ii=i+1; ii<size; ++ii) {
118 Precision v = abs(A[ii][i]);
124 Precision pivot = A[argmax][i];
126 Precision inv_pivot =
static_cast<Precision
>(1)/pivot;
128 for (
int j=i; j<size; ++j)
129 swap(A[i][j], A[argmax][j]);
131 for(
int j=0; j < b.num_cols(); j++)
132 swap(b[i][j], b[argmax][j]);
135 for (
int j=i+1; j<size; ++j)
136 A[i][j] *= inv_pivot;
139 for (
int u=i+1; u<size; ++u) {
140 Precision factor = A[u][i];
142 for (
int j=i+1; j<size; ++j)
143 A[u][j] -= factor * A[i][j];
144 b[u] -= factor * b[i];
149 for (
int i=size-1; i>=0; --i) {
150 for(
int k=0; k <b.num_cols(); k++)
153 for (
int j=i+1; j<size; ++j)
154 x[i][k] -= A[i][j] * x[j][k];
Pretty generic SFINAE introspection generator.
Definition: vec_test.cc:21
Definition: size_mismatch.hh:103
Vector< N, Precision > gaussian_elimination(Matrix< N, N, Precision > A, Vector< N, Precision > b)
Return the solution for , given and .
Definition: gaussian_elimination.h:43
Definition: gaussian_elimination.h:93