From e71bc588e5d3d4a386ba3d63eb1fd7fb4435265b Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 4 May 2024 14:56:50 +0200 Subject: [PATCH] solver move matricies --- include/Solver.h | 8 ++++---- src/Solver.cpp | 39 +++++++++++++++++++------------------ src/Vect.cpp | 6 +++--- src/main.cpp | 4 ++-- test/test_random_kernel.cpp | 4 +++- test/test_solver.cpp | 8 +++++--- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/include/Solver.h b/include/Solver.h index b286e8d..bdf8efb 100644 --- a/include/Solver.h +++ b/include/Solver.h @@ -18,14 +18,14 @@ class Solver { * \param a_Matrix La matrice à traiter * \return L'espace vectoriel correspondant */ - Vect Image(const Matrix& a_Matrix) const; + Vect Image(Matrix&& a_Matrix) const; /** * \brief Calcule le noyau d'une matrice * \param a_Matrix La matrice à traiter * \return L'espace vectoriel correspondant */ - Vect Kernel(const Matrix& a_Matrix) const; + Vect Kernel(Matrix&& a_Matrix) const; /** * \brief Résout le système rectangulaire de la forme AX=B, avec X et B, des vecteurs colonne. @@ -33,12 +33,12 @@ class Solver { * \param a_VectorB La matrice colonne jouant le rôle de B * \return L'espace affine associé */ - VectAffine RectangularSystem(const Matrix& a_MatrixA, const Matrix& a_VectorB) const; + VectAffine RectangularSystem(Matrix&& a_MatrixA, const Matrix& a_VectorB) const; /** * \brief Calcule le rang d'une matrice * \param a_Matrix La matrice à traiter * \note Ceci équivaut à \code Image(a_Matrix).GetCardinal() \endcode */ - std::size_t Rank(const Matrix& a_Matrix) const; + std::size_t Rank(Matrix&& a_Matrix) const; }; \ No newline at end of file diff --git a/src/Solver.cpp b/src/Solver.cpp index f7ec4a2..0548326 100644 --- a/src/Solver.cpp +++ b/src/Solver.cpp @@ -2,37 +2,38 @@ #include "Gauss.h" -Vect Solver::Image(const Matrix& a_Matrix) const { - Matrix result = a_Matrix; - result.Transpose(); - Gauss::GaussJordan(result, true, true); - result.Transpose(); - return {result}; +Vect Solver::Image(Matrix&& a_Matrix) const { + a_Matrix.Transpose(); + Gauss::GaussJordan(a_Matrix, true, true); + a_Matrix.Transpose(); + return {a_Matrix}; } // https://en.wikipedia.org/wiki/Kernel_(linear_algebra)#Computation_by_Gaussian_elimination -Vect Solver::Kernel(const Matrix& a_Matrix) const { - Matrix result = a_Matrix; - result.Transpose(); - result.Augment(Matrix::Identity(result.GetRawCount())); - Gauss::GaussJordan(result, true, true); - result.Transpose(); +Vect Solver::Kernel(Matrix&& a_Matrix) const { + std::size_t matrixRawCount = a_Matrix.GetRawCount(); + std::size_t matrixColumnCount = a_Matrix.GetColumnCount(); + + a_Matrix.Transpose(); + a_Matrix.Augment(Matrix::Identity(a_Matrix.GetRawCount())); + Gauss::GaussJordan(a_Matrix, true, true); + a_Matrix.Transpose(); // nombre de colonnes non nulles - std::size_t origine_colonne = Vect(result.SubMatrix(0, 0, a_Matrix.GetRawCount(), a_Matrix.GetColumnCount())).GetCardinal(); + std::size_t origine_colonne = Vect(a_Matrix.SubMatrix(0, 0, matrixRawCount, matrixColumnCount)).GetCardinal(); - return {result.SubMatrix(a_Matrix.GetRawCount(), origine_colonne, result.GetRawCount() - a_Matrix.GetRawCount(), - result.GetColumnCount() - origine_colonne)}; + return {a_Matrix.SubMatrix(matrixRawCount, origine_colonne, a_Matrix.GetRawCount() - matrixRawCount, + a_Matrix.GetColumnCount() - origine_colonne)}; } -VectAffine Solver::RectangularSystem(const Matrix& a_MatrixA, const Matrix& a_VectorB) const { +VectAffine Solver::RectangularSystem(Matrix&& a_MatrixA, const Matrix& a_VectorB) const { Matrix mat = a_MatrixA; mat.Augment(a_VectorB); Gauss::GaussJordan(mat, true, true); Solver solver; - Vect noyau = solver.Kernel(a_MatrixA); + Vect noyau = solver.Kernel(std::move(a_MatrixA)); Matrix origin = mat.SubMatrix(0, mat.GetColumnCount() - 1, mat.GetRawCount(), 1); // on rajoute des 0 si il faut @@ -49,6 +50,6 @@ VectAffine Solver::RectangularSystem(const Matrix& a_MatrixA, const Matrix& a_Ve return {noyau, fullOrigin}; } -std::size_t Solver::Rank(const Matrix& a_Matrix) const { - return Image(a_Matrix).GetCardinal(); +std::size_t Solver::Rank(Matrix&& a_Matrix) const { + return Image(std::move(a_Matrix)).GetCardinal(); } diff --git a/src/Vect.cpp b/src/Vect.cpp index 5e08543..c1b29d8 100644 --- a/src/Vect.cpp +++ b/src/Vect.cpp @@ -75,9 +75,9 @@ Matrix Vect::GetLinearSystem() const { vect.Transpose(); Solver solver; - vect = solver.Kernel(vect).m_Data; - vect.Transpose(); - return vect; + Matrix result = solver.Kernel(std::move(vect)).m_Data; + result.Transpose(); + return result; } std::size_t Vect::GetDimension() const { diff --git a/src/main.cpp b/src/main.cpp index 2d31f5e..ab089fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,8 +25,8 @@ void test() { Solver solver; - Vect image = solver.Image(mat2); - Vect noyau = solver.Kernel(mat2); + Vect image = solver.Image(Matrix{mat2}); + Vect noyau = solver.Kernel(Matrix{mat2}); std::cout << "\tImage :\n"; Print(image); diff --git a/test/test_random_kernel.cpp b/test/test_random_kernel.cpp index f706c2a..27e36b3 100644 --- a/test/test_random_kernel.cpp +++ b/test/test_random_kernel.cpp @@ -37,7 +37,9 @@ static void Test() { } } - Vect kernel = solver.Kernel(matrix); + Matrix copy = matrix; + + Vect kernel = solver.Kernel(std::move(copy)); Matrix nullVector {matrix.GetRawCount(), 1}; nullVector.Fill(0.0); diff --git a/test/test_solver.cpp b/test/test_solver.cpp index 4ba6169..83a93bb 100644 --- a/test/test_solver.cpp +++ b/test/test_solver.cpp @@ -18,7 +18,7 @@ void TestRectangular() { Solver solver; - std::cout << solver.RectangularSystem(mat2, Matrix::ColumnVector({1, 2})).GetLinearSystem() << std::endl; + std::cout << solver.RectangularSystem(std::move(mat2), Matrix::ColumnVector({1, 2})).GetLinearSystem() << std::endl; std::cout << aff.GetLinearSystem() << std::endl; } @@ -39,8 +39,10 @@ void TestKernelImage() { Solver solver; - test_assert(solver.Image(mat) == image); - test_assert(solver.Kernel(mat) == noyau); + Matrix copy = mat; + + test_assert(solver.Image(std::move(copy)) == image); + test_assert(solver.Kernel(std::move(mat)) == noyau); } }