diff --git a/src/Matrix.h b/src/Matrix.h new file mode 100644 index 0000000..db148b1 --- /dev/null +++ b/src/Matrix.h @@ -0,0 +1,140 @@ +#pragma once + +#include +#include +#include +#include + +template +static bool EqualZero(T var) { + return std::abs(var) < std::pow(10, -17); +} + +template +class Matrix { + private: + std::size_t m_Lignes; + std::size_t m_Colonnes; + std::size_t m_Dimension; + std::vector m_Data; + + public: + Matrix(std::size_t lignes, std::size_t colonnes) : m_Lignes(lignes), m_Colonnes(colonnes), m_Dimension(lignes * colonnes) { + m_Data.resize(m_Dimension); + } + ~Matrix() {} + + void Print() const { + for (size_t i = 0; i < m_Lignes; ++i) { + std::cout << "[ "; + for (size_t j = 0; j < m_Colonnes; ++j) { + std::size_t indice = i * m_Lignes + j; + std::cout << at(i, j) << " "; + } + std::cout << "]"; + std::cout << std::endl; + } + } + + void PrintDebug() { +#ifndef NDEBUG + Print(); + std::cout << "\n"; +#endif + } + + void Insert() { + for (size_t i = 0; i < m_Lignes; ++i) { + for (size_t j = 0; j < m_Colonnes; ++j) { + std::cin >> at(i, j); + } + std::cout << std::endl; + } + } + + /* + void DivideLine(T div, std::size_t line){ + for (size_t i = 0; i < count; i++) + { + + } + + } + */ + + void GaussJordan() { + int r = -1; + for (std::size_t j = 0; j < m_Colonnes; j++) { + std::size_t indice_ligne_maximum = r + 1; + + // Recherche maximum + for (std::size_t i = r + 1; i < m_Lignes; i++) { + if (std::abs(at(i, j)) > std::abs(at(indice_ligne_maximum, j))) + indice_ligne_maximum = i; + } + + std::cout << "l'indice du maximum est : " << indice_ligne_maximum << "\n\n"; + + // Si A[k,j]≠0 alors (A[k,j] désigne la valeur de la ligne k et de la colonne j) + if (!EqualZero(at(indice_ligne_maximum, j))) { + r++; + + std::cout << "On divise la ligne " << indice_ligne_maximum << " par " << at(indice_ligne_maximum, j) << "\n"; + // Diviser la ligne k par A[k,j] (On normalise la ligne de pivot de façon que le + // pivot prenne la valeur 1) + for (int l = m_Colonnes - 1; l >= 0; l--) { + at(indice_ligne_maximum, l) /= at(indice_ligne_maximum, j); + } + + PrintDebug(); + + // Si k≠r alors + if (indice_ligne_maximum != r) { + // Échanger les lignes k et r (On place la ligne du pivot en position r) + std::cout << "On échange les lignes " << indice_ligne_maximum << " et " << r << '\n'; + for (std::size_t k = 0; k < m_Colonnes; k++) { + std::swap(at(indice_ligne_maximum, k), at(r, k)); + } + } + + PrintDebug(); + + // Pour i de 1 jusqu'à n (On simplifie les autres lignes) + for (std::size_t i = 0; i < m_Lignes; 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]) + std::cout << "On soustrait à la ligne " << i << " la ligne " << r << " multipliée par " << at(i, j) << "\n"; + for (int k = m_Colonnes - 1; k >= 0; k--) { + at(i, k) -= at(r, k) * at(i, j); + std::cout << "On soustrait à (" << i << "," << k << ") , [ (" << r << "," << k << ") = " << at(r, k) + << " ] * [ (" << i << "," << j << ") = " << at(i, j) << " ]\n"; + PrintDebug(); + } + } + } + } + } + } + + T& operator[](std::size_t indice) { + return at(indice); + } + + T& at(std::size_t ligne, std::size_t colonne) { + return m_Data[ligne * m_Lignes + colonne]; + } + + T at(std::size_t ligne, std::size_t colonne) const { + return m_Data[ligne * m_Lignes + colonne]; + } + + /*std::vector::iterator begin() { + return m_Data.begin(); + } + + std::vector::iterator end() { + return m_Data.end(); + }*/ +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0290855..4513251 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,141 +1,4 @@ -#include -#include -#include -#include - -template -static bool EqualZero(T var) { - return std::abs(var) < std::pow(10, -17); -} - -template -class Matrix { - private: - std::size_t m_Lignes; - std::size_t m_Colonnes; - std::size_t m_Dimension; - std::vector m_Data; - - public: - Matrix(std::size_t lignes, std::size_t colonnes) : m_Lignes(lignes), m_Colonnes(colonnes), m_Dimension(lignes * colonnes) { - m_Data.resize(m_Dimension); - } - ~Matrix() {} - - void Print() const { - for (size_t i = 0; i < m_Lignes; ++i) { - std::cout << "[ "; - for (size_t j = 0; j < m_Colonnes; ++j) { - std::size_t indice = i * m_Lignes + j; - std::cout << at(i, j) << " "; - } - std::cout << "]"; - std::cout << std::endl; - } - } - - void PrintDebug() { -#ifndef NDEBUG - Print(); - std::cout << "\n"; -#endif - } - - void Insert() { - for (size_t i = 0; i < m_Lignes; ++i) { - for (size_t j = 0; j < m_Colonnes; ++j) { - std::cin >> at(i, j); - } - std::cout << std::endl; - } - } - - /* - void DivideLine(T div, std::size_t line){ - for (size_t i = 0; i < count; i++) - { - - } - - } - */ - - void GaussJordan() { - int r = -1; - for (std::size_t j = 0; j < m_Colonnes; j++) { - std::size_t indice_ligne_maximum = r + 1; - - // Recherche maximum - for (std::size_t i = r + 1; i < m_Lignes; i++) { - if (std::abs(at(i, j)) > std::abs(at(indice_ligne_maximum, j))) - indice_ligne_maximum = i; - } - - std::cout << "l'indice du maximum est : " << indice_ligne_maximum << "\n\n"; - - // Si A[k,j]≠0 alors (A[k,j] désigne la valeur de la ligne k et de la colonne j) - if (!EqualZero(at(indice_ligne_maximum, j))) { - r++; - - std::cout << "On divise la ligne " << indice_ligne_maximum << " par " << at(indice_ligne_maximum, j) << "\n"; - // Diviser la ligne k par A[k,j] (On normalise la ligne de pivot de façon que le - // pivot prenne la valeur 1) - for (int l = m_Colonnes - 1; l >= 0; l--) { - at(indice_ligne_maximum, l) /= at(indice_ligne_maximum, j); - } - - PrintDebug(); - - // Si k≠r alors - if (indice_ligne_maximum != r) { - // Échanger les lignes k et r (On place la ligne du pivot en position r) - std::cout << "On échange les lignes " << indice_ligne_maximum << " et " << r << '\n'; - for (std::size_t k = 0; k < m_Colonnes; k++) { - std::swap(at(indice_ligne_maximum, k), at(r, k)); - } - } - - PrintDebug(); - - // Pour i de 1 jusqu'à n (On simplifie les autres lignes) - for (std::size_t i = 0; i < m_Lignes; 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]) - std::cout << "On soustrait à la ligne " << i << " la ligne " << r << " multipliée par " << at(i, j) << "\n"; - for (int k = m_Colonnes - 1; k >= 0; k--) { - at(i, k) -= at(r, k) * at(i, j); - std::cout << "On soustrait à (" << i << "," << k << ") , [ (" << r << "," << k << ") = " << at(r, k) - << " ] * [ (" << i << "," << j << ") = " << at(i, j) << " ]\n"; - PrintDebug(); - } - } - } - } - } - } - - T& operator[](std::size_t indice) { - return at(indice); - } - - T& at(std::size_t ligne, std::size_t colonne) { - return m_Data[ligne * m_Lignes + colonne]; - } - - T at(std::size_t ligne, std::size_t colonne) const { - return m_Data[ligne * m_Lignes + colonne]; - } - - /*std::vector::iterator begin() { - return m_Data.begin(); - } - - std::vector::iterator end() { - return m_Data.end(); - }*/ -}; +#include "Matrix.h" void test() { Matrix mat(3, 3);