refactor project
This commit is contained in:
75
src/Gauss.cpp
Normal file
75
src/Gauss.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include "Gauss.h"
|
||||
|
||||
#include "Matrix.h"
|
||||
|
||||
namespace Gauss {
|
||||
|
||||
static void GaussNonJordan(Matrix& mat, bool reduite) {
|
||||
int r = -1;
|
||||
for (std::size_t j = 0; j < mat.GetColumnCount(); j++) {
|
||||
std::size_t indice_ligne_maximum = r + 1;
|
||||
|
||||
// Recherche maximum
|
||||
for (std::size_t i = r + 1; i < mat.GetRawCount(); i++) {
|
||||
if (std::abs(mat.at(i, j)) > std::abs(mat.at(indice_ligne_maximum, j)))
|
||||
indice_ligne_maximum = i;
|
||||
}
|
||||
|
||||
// Si A[k,j]≠0 alors (A[k,j] désigne la valeur de la ligne k et de la colonne j)
|
||||
if (!IsEqualZero(mat.at(indice_ligne_maximum, j))) {
|
||||
r++;
|
||||
|
||||
// Si k≠r alors
|
||||
if (indice_ligne_maximum != r) {
|
||||
// Échanger les lignes k et r (On place la ligne du pivot en position r)
|
||||
for (std::size_t k = 0; k < mat.GetColumnCount(); k++) {
|
||||
std::swap(mat.at(indice_ligne_maximum, k), mat.at(r, k));
|
||||
}
|
||||
}
|
||||
|
||||
// Pour i de 1 jusqu'à n (On simplifie les autres lignes)
|
||||
for (std::size_t i = (reduite ? 0 : j); i < mat.GetRawCount(); i++) {
|
||||
// Si i≠r alors
|
||||
if (i != r) {
|
||||
// Soustraire à la ligne i la ligne r multipliée par A[i,j] (de façon à
|
||||
// annuler A[i,j])
|
||||
for (int k = mat.GetColumnCount() - 1; k >= 0; k--) {
|
||||
long double pivot = mat.at(r, j);
|
||||
long double anul = mat.at(i, j);
|
||||
mat.at(i, k) = mat.at(i, k) * pivot - mat.at(r, k) * anul;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void GaussJordan(Matrix& mat, bool reduite) {
|
||||
GaussNonJordan(mat, reduite);
|
||||
for (std::size_t i = 0; i < mat.GetRawCount(); i++) {
|
||||
int k = -1;
|
||||
for (std::size_t j = 0; j < mat.GetColumnCount(); j++) {
|
||||
if (!IsEqualZero(mat.at(i, j))) {
|
||||
k = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// ligne de 0
|
||||
if (k == -1)
|
||||
break;
|
||||
// on divise la ligne par (i, k)
|
||||
long double annul = mat.at(i, k);
|
||||
for (int j = 0; j < mat.GetColumnCount(); j++) {
|
||||
mat.at(i, j) /= annul;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GaussJordan(Matrix& mat, bool reduite, bool normalise) {
|
||||
if (normalise)
|
||||
GaussJordan(mat, reduite);
|
||||
else
|
||||
GaussNonJordan(mat, reduite);
|
||||
}
|
||||
|
||||
} // namespace Gauss
|
||||
Reference in New Issue
Block a user