Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c004b64ed |
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@@ -7,8 +7,8 @@
|
|||||||
{
|
{
|
||||||
"type": "xmake",
|
"type": "xmake",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Debug XMake target",
|
"name": "Debug random kernel",
|
||||||
"target": "Pivot",
|
"target": "test_random_kernel",
|
||||||
"cwd": "${workspaceFolder}/matricies",
|
"cwd": "${workspaceFolder}/matricies",
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
19
.vscode/settings.json
vendored
19
.vscode/settings.json
vendored
@@ -44,6 +44,23 @@
|
|||||||
"stdexcept": "cpp",
|
"stdexcept": "cpp",
|
||||||
"streambuf": "cpp",
|
"streambuf": "cpp",
|
||||||
"cinttypes": "cpp",
|
"cinttypes": "cpp",
|
||||||
"typeinfo": "cpp"
|
"typeinfo": "cpp",
|
||||||
|
"codecvt": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"future": "cpp",
|
||||||
|
"iomanip": "cpp",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"semaphore": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stop_token": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"ranges": "cpp",
|
||||||
|
"span": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
16
imgui.ini
Normal file
16
imgui.ini
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[Window][Debug##Default]
|
||||||
|
Pos=60,60
|
||||||
|
Size=400,400
|
||||||
|
|
||||||
|
[Window][Right Top Window]
|
||||||
|
Pos=640,0
|
||||||
|
Size=640,576
|
||||||
|
|
||||||
|
[Window][Bottom Part]
|
||||||
|
Pos=0,576
|
||||||
|
Size=1280,144
|
||||||
|
|
||||||
|
[Window][Left Top Window]
|
||||||
|
Pos=0,0
|
||||||
|
Size=640,576
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
class Matrix {
|
class Matrix {
|
||||||
public:
|
public:
|
||||||
typedef NR Element;
|
typedef long double Element;
|
||||||
typedef std::vector<Element>::iterator iterator;
|
typedef std::vector<Element>::iterator iterator;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
BIN
matricies/core
Normal file
BIN
matricies/core
Normal file
Binary file not shown.
2067
matricies/plot.eps
Normal file
2067
matricies/plot.eps
Normal file
File diff suppressed because it is too large
Load Diff
BIN
matricies/plot.png
Normal file
BIN
matricies/plot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
135
matricies/plot.tex
Normal file
135
matricies/plot.tex
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
% GNUPLOT: LaTeX picture with Postscript
|
||||||
|
\begingroup
|
||||||
|
\makeatletter
|
||||||
|
\providecommand\color[2][]{%
|
||||||
|
\GenericError{(gnuplot) \space\space\space\@spaces}{%
|
||||||
|
Package color not loaded in conjunction with
|
||||||
|
terminal option `colourtext'%
|
||||||
|
}{See the gnuplot documentation for explanation.%
|
||||||
|
}{Either use 'blacktext' in gnuplot or load the package
|
||||||
|
color.sty in LaTeX.}%
|
||||||
|
\renewcommand\color[2][]{}%
|
||||||
|
}%
|
||||||
|
\providecommand\includegraphics[2][]{%
|
||||||
|
\GenericError{(gnuplot) \space\space\space\@spaces}{%
|
||||||
|
Package graphicx or graphics not loaded%
|
||||||
|
}{See the gnuplot documentation for explanation.%
|
||||||
|
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}%
|
||||||
|
\renewcommand\includegraphics[2][]{}%
|
||||||
|
}%
|
||||||
|
\providecommand\rotatebox[2]{#2}%
|
||||||
|
\@ifundefined{ifGPcolor}{%
|
||||||
|
\newif\ifGPcolor
|
||||||
|
\GPcolortrue
|
||||||
|
}{}%
|
||||||
|
\@ifundefined{ifGPblacktext}{%
|
||||||
|
\newif\ifGPblacktext
|
||||||
|
\GPblacktexttrue
|
||||||
|
}{}%
|
||||||
|
% define a \g@addto@macro without @ in the name:
|
||||||
|
\let\gplgaddtomacro\g@addto@macro
|
||||||
|
% define empty templates for all commands taking text:
|
||||||
|
\gdef\gplbacktext{}%
|
||||||
|
\gdef\gplfronttext{}%
|
||||||
|
\makeatother
|
||||||
|
\ifGPblacktext
|
||||||
|
% no textcolor at all
|
||||||
|
\def\colorrgb#1{}%
|
||||||
|
\def\colorgray#1{}%
|
||||||
|
\else
|
||||||
|
% gray or color?
|
||||||
|
\ifGPcolor
|
||||||
|
\def\colorrgb#1{\color[rgb]{#1}}%
|
||||||
|
\def\colorgray#1{\color[gray]{#1}}%
|
||||||
|
\expandafter\def\csname LTw\endcsname{\color{white}}%
|
||||||
|
\expandafter\def\csname LTb\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LTa\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}%
|
||||||
|
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}%
|
||||||
|
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}%
|
||||||
|
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}%
|
||||||
|
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}%
|
||||||
|
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}%
|
||||||
|
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}%
|
||||||
|
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}%
|
||||||
|
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}%
|
||||||
|
\else
|
||||||
|
% gray
|
||||||
|
\def\colorrgb#1{\color{black}}%
|
||||||
|
\def\colorgray#1{\color[gray]{#1}}%
|
||||||
|
\expandafter\def\csname LTw\endcsname{\color{white}}%
|
||||||
|
\expandafter\def\csname LTb\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LTa\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT0\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT1\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT2\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT3\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT4\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT5\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT6\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT7\endcsname{\color{black}}%
|
||||||
|
\expandafter\def\csname LT8\endcsname{\color{black}}%
|
||||||
|
\fi
|
||||||
|
\fi
|
||||||
|
\setlength{\unitlength}{0.0500bp}%
|
||||||
|
\ifx\gptboxheight\undefined%
|
||||||
|
\newlength{\gptboxheight}%
|
||||||
|
\newlength{\gptboxwidth}%
|
||||||
|
\newsavebox{\gptboxtext}%
|
||||||
|
\fi%
|
||||||
|
\setlength{\fboxrule}{0.5pt}%
|
||||||
|
\setlength{\fboxsep}{1pt}%
|
||||||
|
\definecolor{tbcol}{rgb}{1,1,1}%
|
||||||
|
\begin{picture}(7200.00,5040.00)%
|
||||||
|
\gplgaddtomacro\gplbacktext{%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,554){\makebox(0,0)[r]{\strut{}0}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,1141){\makebox(0,0)[r]{\strut{}0.05}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,1727){\makebox(0,0)[r]{\strut{}0.1}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,2314){\makebox(0,0)[r]{\strut{}0.15}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,2901){\makebox(0,0)[r]{\strut{}0.2}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,3488){\makebox(0,0)[r]{\strut{}0.25}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,4074){\makebox(0,0)[r]{\strut{}0.3}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(803,4661){\makebox(0,0)[r]{\strut{}0.35}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(935,334){\makebox(0,0){\strut{}0}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(1865,334){\makebox(0,0){\strut{}50}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(2795,334){\makebox(0,0){\strut{}100}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(3725,334){\makebox(0,0){\strut{}150}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(4655,334){\makebox(0,0){\strut{}200}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(5585,334){\makebox(0,0){\strut{}250}}%
|
||||||
|
\colorrgb{0.15,0.15,0.15}%%
|
||||||
|
\put(6515,334){\makebox(0,0){\strut{}300}}%
|
||||||
|
}%
|
||||||
|
\gplgaddtomacro\gplfronttext{%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(66,2607){\rotatebox{-270}{\makebox(0,0){\strut{}Temps d'exécution (s)}}}%
|
||||||
|
\put(3725,4){\makebox(0,0){\strut{}Taille des matrices}}%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(1922,4488){\makebox(0,0)[l]{\strut{}Echelonnage non réduit}}%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(1922,4268){\makebox(0,0)[l]{\strut{}Echelonnage réduit}}%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(1922,4048){\makebox(0,0)[l]{\strut{}Echelonnage non réduit normalisé}}%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(1922,3828){\makebox(0,0)[l]{\strut{}Echelonnage réduit normalisé}}%
|
||||||
|
\csname LTb\endcsname%%
|
||||||
|
\put(3725,4991){\makebox(0,0){/:Bold Echelonnage de matrices}}%
|
||||||
|
}%
|
||||||
|
\gplbacktext
|
||||||
|
\put(0,0){\includegraphics[width={360.00bp},height={252.00bp}]{plot}}%
|
||||||
|
\gplfronttext
|
||||||
|
\end{picture}%
|
||||||
|
\endgroup
|
||||||
@@ -16,6 +16,10 @@ static void SwapLines(Matrix& mat, std::size_t line1, std::size_t line2) {
|
|||||||
static void DivideLine(Matrix& mat, std::size_t line, Matrix::Element number) {
|
static void DivideLine(Matrix& mat, std::size_t line, Matrix::Element number) {
|
||||||
std::transform(std::execution::par_unseq, mat.GetLineIterator(line), mat.GetLineIterator(line + 1), mat.GetLineIterator(line),
|
std::transform(std::execution::par_unseq, mat.GetLineIterator(line), mat.GetLineIterator(line + 1), mat.GetLineIterator(line),
|
||||||
[number](Matrix::Element e) { return e /= number; });
|
[number](Matrix::Element e) { return e /= number; });
|
||||||
|
|
||||||
|
/*for (std::size_t i = 0; i < mat.GetColumnCount(); i++) {
|
||||||
|
mat.at(line, i) /= number;
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static int FirstNotNullElementIndexOnColumn(Matrix& mat, std::size_t column, std::size_t startLine = 0) {
|
static int FirstNotNullElementIndexOnColumn(Matrix& mat, std::size_t column, std::size_t startLine = 0) {
|
||||||
@@ -38,7 +42,7 @@ static void SimplifyLine(Matrix& mat, std::size_t line, std::size_t pivot_line,
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GaussJordanReduced(Matrix& a_Matrix, bool a_Normalise) {
|
static void GaussJordanReducedNorma(Matrix& a_Matrix) {
|
||||||
int indice_ligne_pivot = -1;
|
int indice_ligne_pivot = -1;
|
||||||
|
|
||||||
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
||||||
@@ -56,9 +60,7 @@ static void GaussJordanReduced(Matrix& a_Matrix, bool a_Normalise) {
|
|||||||
|
|
||||||
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
||||||
|
|
||||||
if (a_Normalise) {
|
|
||||||
DivideLine(a_Matrix, indice_ligne_pivot, pivot);
|
DivideLine(a_Matrix, indice_ligne_pivot, pivot);
|
||||||
}
|
|
||||||
|
|
||||||
auto range = std::views::iota(static_cast<std::size_t>(0), a_Matrix.GetRawCount());
|
auto range = std::views::iota(static_cast<std::size_t>(0), a_Matrix.GetRawCount());
|
||||||
|
|
||||||
@@ -71,7 +73,7 @@ static void GaussJordanReduced(Matrix& a_Matrix, bool a_Normalise) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GaussJordanTriangular(Matrix& a_Matrix, bool a_Normalise) {
|
static void GaussJordanReduced(Matrix& a_Matrix) {
|
||||||
int indice_ligne_pivot = -1;
|
int indice_ligne_pivot = -1;
|
||||||
|
|
||||||
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
||||||
@@ -89,25 +91,85 @@ static void GaussJordanTriangular(Matrix& a_Matrix, bool a_Normalise) {
|
|||||||
|
|
||||||
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
||||||
|
|
||||||
if (a_Normalise) {
|
auto range = std::views::iota(static_cast<std::size_t>(0), a_Matrix.GetRawCount());
|
||||||
DivideLine(a_Matrix, indice_ligne_pivot, pivot);
|
|
||||||
|
// On simplifie les autres lignes
|
||||||
|
std::for_each(std::execution::par_unseq, range.begin(), range.end(), [&a_Matrix, j, indice_ligne_pivot](std::size_t i) {
|
||||||
|
if (i != static_cast<std::size_t>(indice_ligne_pivot)) {
|
||||||
|
SimplifyLine(a_Matrix, i, indice_ligne_pivot, j);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GaussJordanTriangular(Matrix& a_Matrix) {
|
||||||
|
int indice_ligne_pivot = -1;
|
||||||
|
|
||||||
|
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
||||||
|
|
||||||
|
int indice_ligne_pivot_trouve = FirstNotNullElementIndexOnColumn(a_Matrix, j, indice_ligne_pivot + 1);
|
||||||
|
|
||||||
|
if (indice_ligne_pivot_trouve < 0) // colonne de 0
|
||||||
|
continue; // on regarde la prochaine colonne
|
||||||
|
|
||||||
|
indice_ligne_pivot++;
|
||||||
|
|
||||||
|
if (indice_ligne_pivot_trouve != indice_ligne_pivot) {
|
||||||
|
SwapLines(a_Matrix, indice_ligne_pivot_trouve, indice_ligne_pivot);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
||||||
|
|
||||||
auto range = std::views::iota(static_cast<std::size_t>(indice_ligne_pivot + 1), a_Matrix.GetRawCount());
|
auto range = std::views::iota(static_cast<std::size_t>(indice_ligne_pivot + 1), a_Matrix.GetRawCount());
|
||||||
|
|
||||||
// On simplifie les autres lignes après la ligne du pivot
|
// On simplifie les autres lignes après la ligne du pivot
|
||||||
std::for_each(std::execution::par_unseq, range.begin(), range.end(),
|
std::for_each(std::execution::par_unseq, range.begin(), range.end(),
|
||||||
[&a_Matrix, indice_ligne_pivot, j](std::size_t i) {
|
[&a_Matrix, indice_ligne_pivot, j](std::size_t i) { SimplifyLine(a_Matrix, i, indice_ligne_pivot, j); });
|
||||||
SimplifyLine(a_Matrix, i, indice_ligne_pivot, j);
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
static void GaussJordanTriangularNorma(Matrix& a_Matrix) {
|
||||||
|
int indice_ligne_pivot = -1;
|
||||||
|
|
||||||
|
for (std::size_t j = 0; j < a_Matrix.GetColumnCount(); j++) {
|
||||||
|
|
||||||
|
int indice_ligne_pivot_trouve = FirstNotNullElementIndexOnColumn(a_Matrix, j, indice_ligne_pivot + 1);
|
||||||
|
|
||||||
|
if (indice_ligne_pivot_trouve < 0) // colonne de 0
|
||||||
|
continue; // on regarde la prochaine colonne
|
||||||
|
|
||||||
|
indice_ligne_pivot++;
|
||||||
|
|
||||||
|
if (indice_ligne_pivot_trouve != indice_ligne_pivot) {
|
||||||
|
SwapLines(a_Matrix, indice_ligne_pivot_trouve, indice_ligne_pivot);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix::Element pivot = a_Matrix.at(indice_ligne_pivot, j);
|
||||||
|
|
||||||
|
DivideLine(a_Matrix, indice_ligne_pivot, pivot);
|
||||||
|
|
||||||
|
auto range = std::views::iota(static_cast<std::size_t>(indice_ligne_pivot + 1), a_Matrix.GetRawCount());
|
||||||
|
|
||||||
|
// On simplifie les autres lignes après la ligne du pivot
|
||||||
|
std::for_each(std::execution::par_unseq, range.begin(), range.end(),
|
||||||
|
[&a_Matrix, indice_ligne_pivot, j](std::size_t i) { SimplifyLine(a_Matrix, i, indice_ligne_pivot, j); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GaussJordan(Matrix& a_Matrix, bool a_Reduite, bool a_Normalise) {
|
void GaussJordan(Matrix& a_Matrix, bool a_Reduite, bool a_Normalise) {
|
||||||
if (a_Reduite)
|
if (a_Reduite) {
|
||||||
GaussJordanReduced(a_Matrix, a_Normalise);
|
if (a_Normalise) {
|
||||||
else
|
GaussJordanReducedNorma(a_Matrix);
|
||||||
GaussJordanTriangular(a_Matrix, a_Normalise);
|
} else {
|
||||||
|
GaussJordanReduced(a_Matrix);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (a_Normalise) {
|
||||||
|
GaussJordanTriangularNorma(a_Matrix);
|
||||||
|
} else {
|
||||||
|
GaussJordanTriangular(a_Matrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Gauss
|
} // namespace Gauss
|
||||||
@@ -2,6 +2,12 @@
|
|||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
#include "test_assert.h"
|
#include "test_assert.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
static constexpr int MATRIX_MAX_SIZE = 300;
|
||||||
|
static constexpr int EXECUTION_COUNT = 1;
|
||||||
|
|
||||||
struct Test {
|
struct Test {
|
||||||
Matrix mat;
|
Matrix mat;
|
||||||
Matrix res;
|
Matrix res;
|
||||||
@@ -30,6 +36,22 @@ static const std::vector<Test> TEST_MATRICES = {
|
|||||||
}}}
|
}}}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static unsigned int GetRandomInt() {
|
||||||
|
return rand() % MATRIX_MAX_SIZE + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Matrix GetRandomMatrix(std::size_t a_Raw, std::size_t a_Column) {
|
||||||
|
Matrix matrix {a_Raw, a_Column};
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < matrix.GetRawCount(); i++) {
|
||||||
|
for (std::size_t j = 0; j < matrix.GetColumnCount(); j++) {
|
||||||
|
matrix.at(i, j) = GetRandomInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
void test() {
|
void test() {
|
||||||
for (Test test : TEST_MATRICES) {
|
for (Test test : TEST_MATRICES) {
|
||||||
Gauss::GaussJordan(test.mat, true, true);
|
Gauss::GaussJordan(test.mat, true, true);
|
||||||
@@ -37,7 +59,26 @@ void test() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gaussTest() {
|
||||||
|
auto start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
for (int i = 0; i < EXECUTION_COUNT; i++) {
|
||||||
|
Matrix mat = GetRandomMatrix(500, 500);
|
||||||
|
Gauss::GaussJordan(mat, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto end = std::chrono::system_clock::now();
|
||||||
|
std::chrono::duration<double> elapsed_seconds = end - start;
|
||||||
|
std::cout << "\tgauss jordan elapsed time : " << elapsed_seconds.count() << "s" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void speedTest() {
|
||||||
|
gaussTest();
|
||||||
|
// gaussColumnTest();
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
test();
|
test();
|
||||||
|
speedTest();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
109
test/test_plot.cpp
Normal file
109
test/test_plot.cpp
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cmath>
|
||||||
|
#include <execution>
|
||||||
|
#include <future>
|
||||||
|
#include <matplot/matplot.h>
|
||||||
|
|
||||||
|
#include "Gauss.h"
|
||||||
|
#include "Matrix.h"
|
||||||
|
#include "Solver.h"
|
||||||
|
|
||||||
|
static constexpr int EXECUTION_COUNT = 100;
|
||||||
|
static constexpr int MATRIX_MAX_SIZE = 300;
|
||||||
|
|
||||||
|
static unsigned int GetRandomInt() {
|
||||||
|
return rand() % MATRIX_MAX_SIZE + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Matrix GetRandomMatrix(std::size_t a_Raw, std::size_t a_Column) {
|
||||||
|
Matrix matrix {a_Raw, a_Column};
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < matrix.GetRawCount(); i++) {
|
||||||
|
for (std::size_t j = 0; j < matrix.GetColumnCount(); j++) {
|
||||||
|
matrix.at(i, j) = GetRandomInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<double> GaussJordan(const std::vector<double>& x) {
|
||||||
|
std::vector<double> y;
|
||||||
|
|
||||||
|
std::for_each(x.begin(), x.end(), [&y](double size) {
|
||||||
|
auto start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
for (int j = 0; j < EXECUTION_COUNT; j++) {
|
||||||
|
Matrix mat = GetRandomMatrix(size, size);
|
||||||
|
Gauss::GaussJordan(mat, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto end = std::chrono::system_clock::now();
|
||||||
|
std::chrono::duration<double> elapsed_seconds = end - start;
|
||||||
|
std::cout << "S " << size << "\n";
|
||||||
|
y.push_back(elapsed_seconds.count() / static_cast<double>(EXECUTION_COUNT));
|
||||||
|
});
|
||||||
|
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<double> GaussJordanReduite(const std::vector<double>& x) {
|
||||||
|
std::vector<double> y;
|
||||||
|
|
||||||
|
std::for_each(x.begin(), x.end(), [&y](double size) {
|
||||||
|
auto start = std::chrono::system_clock::now();
|
||||||
|
|
||||||
|
for (int j = 0; j < EXECUTION_COUNT; j++) {
|
||||||
|
Matrix mat = GetRandomMatrix(size, size);
|
||||||
|
Gauss::GaussJordan(mat, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto end = std::chrono::system_clock::now();
|
||||||
|
std::chrono::duration<double> elapsed_seconds = end - start;
|
||||||
|
std::cout << "R " << size << "\n";
|
||||||
|
y.push_back(elapsed_seconds.count() / static_cast<double>(EXECUTION_COUNT));
|
||||||
|
});
|
||||||
|
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
srand(time(0));
|
||||||
|
|
||||||
|
int start = 1;
|
||||||
|
|
||||||
|
std::vector<double> x = matplot::linspace(start, MATRIX_MAX_SIZE, MATRIX_MAX_SIZE - start + 1);
|
||||||
|
//std::vector<double> x = {5000};
|
||||||
|
std::vector<double> y, y1, y2, y3;
|
||||||
|
|
||||||
|
// y2.resize(x.size());
|
||||||
|
|
||||||
|
{
|
||||||
|
auto result1 = std::async(std::launch::async, &GaussJordan, x);
|
||||||
|
auto result2 = std::async(std::launch::async, &GaussJordanReduite, x);
|
||||||
|
y = result1.get();
|
||||||
|
y1 = result2.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "Fini !\n";
|
||||||
|
|
||||||
|
|
||||||
|
// std::transform(x.begin(), x.end(), y2.begin(), [](double x) { return 1.0 / (100.0 * 100.0) * 0.6 * x * x; });
|
||||||
|
|
||||||
|
matplot::title("Echelonnage de matrices");
|
||||||
|
matplot::xlabel("Taille des matrices");
|
||||||
|
matplot::ylabel("Temps d'exécution (s)");
|
||||||
|
|
||||||
|
matplot::hold(matplot::on);
|
||||||
|
matplot::plot(x, y);
|
||||||
|
matplot::plot(x, y1);
|
||||||
|
|
||||||
|
auto l = matplot::legend({"Echelonnage non réduit", "Echelonnage réduit", "Echelonnage non réduit normalisé", "Echelonnage réduit normalisé"});
|
||||||
|
l->location(matplot::legend::general_alignment::topleft);
|
||||||
|
|
||||||
|
matplot::show();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -16,6 +16,16 @@ static int GetRandomInt() {
|
|||||||
return rand() % 11 - 5;
|
return rand() % 11 - 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define print_time(i) \
|
||||||
|
end = std::chrono::system_clock::now(); \
|
||||||
|
elapsed_seconds = end - start; \
|
||||||
|
std::cout << "elapsed time " << i << " : " << elapsed_seconds.count() << "s" << std::endl; \
|
||||||
|
start = std::chrono::system_clock::now()
|
||||||
|
|
||||||
|
static unsigned int GetRandomSize() {
|
||||||
|
return rand() % MATRIX_MAX_SIZE + 1;
|
||||||
|
}
|
||||||
|
|
||||||
static Matrix GetRandomMatrix(std::size_t a_Raw, std::size_t a_Column) {
|
static Matrix GetRandomMatrix(std::size_t a_Raw, std::size_t a_Column) {
|
||||||
Matrix matrix {a_Raw, a_Column};
|
Matrix matrix {a_Raw, a_Column};
|
||||||
|
|
||||||
@@ -29,24 +39,34 @@ static Matrix GetRandomMatrix(std::size_t a_Raw, std::size_t a_Column) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool Test() {
|
static bool Test() {
|
||||||
Matrix matrix = GetRandomMatrix(rand() % MATRIX_MAX_SIZE + 1, rand() % MATRIX_MAX_SIZE + 1);
|
auto start = std::chrono::system_clock::now();
|
||||||
|
auto begin = start;
|
||||||
|
auto end = start;
|
||||||
|
std::chrono::duration<double> elapsed_seconds = end - start;
|
||||||
|
|
||||||
for (std::size_t i = 0; i < matrix.GetRawCount(); i++) {
|
std::cout << "Begin\n";
|
||||||
for (std::size_t j = 0; j < matrix.GetColumnCount(); j++) {
|
|
||||||
matrix.at(i, j) = GetRandomInt();
|
Matrix matrix = GetRandomMatrix(GetRandomSize(), GetRandomSize());
|
||||||
}
|
|
||||||
}
|
print_time(1);
|
||||||
|
|
||||||
Matrix copy = matrix;
|
Matrix copy = matrix;
|
||||||
|
|
||||||
Vect kernel = solver.Kernel(std::move(copy));
|
Vect kernel = solver.Kernel(std::move(copy));
|
||||||
|
|
||||||
|
print_time(2);
|
||||||
|
|
||||||
Matrix nullVector {matrix.GetRawCount(), 1};
|
Matrix nullVector {matrix.GetRawCount(), 1};
|
||||||
nullVector.Fill(0.0);
|
nullVector.Fill(0.0);
|
||||||
|
|
||||||
for (std::size_t i = 0; i < kernel.GetCardinal(); i++) {
|
for (std::size_t i = 0; i < kernel.GetCardinal(); i++) {
|
||||||
test_assert(matrix * kernel.GetVector(i) == nullVector);
|
Matrix result = matrix * kernel.GetVector(i);
|
||||||
|
if(!(result == nullVector)) {
|
||||||
|
test_assert(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print_time(3);
|
||||||
|
|
||||||
for (std::size_t i = 0; i < KERNEL_CHECKS; i++) {
|
for (std::size_t i = 0; i < KERNEL_CHECKS; i++) {
|
||||||
Matrix vector = GetRandomMatrix(kernel.GetDimension(), 1);
|
Matrix vector = GetRandomMatrix(kernel.GetDimension(), 1);
|
||||||
@@ -54,9 +74,22 @@ static bool Test() {
|
|||||||
test_assert(kernel.IsElementOf(vector) == (matrix * vector == nullVector));
|
test_assert(kernel.IsElementOf(vector) == (matrix * vector == nullVector));
|
||||||
}
|
}
|
||||||
|
|
||||||
Vect kernel2 = solver.Kernel(kernel.GetLinearSystem());
|
print_time(4);
|
||||||
|
|
||||||
|
Matrix linearSystem = kernel.GetLinearSystem();
|
||||||
|
|
||||||
|
print_time(5);
|
||||||
|
|
||||||
|
Vect kernel2 = solver.Kernel(std::move(linearSystem));
|
||||||
|
|
||||||
test_assert(kernel == kernel2);
|
test_assert(kernel == kernel2);
|
||||||
|
|
||||||
|
print_time(6);
|
||||||
|
|
||||||
|
elapsed_seconds = end - begin;
|
||||||
|
std::cout << "final elapsed time: " << elapsed_seconds.count() << "s" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "End\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +102,7 @@ int main() {
|
|||||||
for (int i = 0; i < EXECUTION_COUNT; i++) {
|
for (int i = 0; i < EXECUTION_COUNT; i++) {
|
||||||
auto handle = std::async(std::launch::async, &Test);
|
auto handle = std::async(std::launch::async, &Test);
|
||||||
results.push_back(std::move(handle));
|
results.push_back(std::move(handle));
|
||||||
|
// Test();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& result : results) {
|
for (auto& result : results) {
|
||||||
|
|||||||
@@ -7,10 +7,14 @@ set_languages("c++20")
|
|||||||
set_warnings("all")
|
set_warnings("all")
|
||||||
add_includedirs("include")
|
add_includedirs("include")
|
||||||
|
|
||||||
|
add_requires("matplotplusplus")
|
||||||
|
|
||||||
-- Solver Library
|
-- Solver Library
|
||||||
target("Pivot")
|
target("Pivot")
|
||||||
set_kind("static")
|
set_kind("static")
|
||||||
add_files("src/*.cpp")
|
add_files("src/*.cpp")
|
||||||
|
add_cxxflags("-ffast-math")
|
||||||
|
set_optimize("fastest")
|
||||||
remove_files("src/main.cpp")
|
remove_files("src/main.cpp")
|
||||||
|
|
||||||
|
|
||||||
@@ -49,6 +53,7 @@ for _, file in ipairs(os.files("test/test_*.cpp")) do
|
|||||||
set_default(false)
|
set_default(false)
|
||||||
|
|
||||||
add_deps("Pivot")
|
add_deps("Pivot")
|
||||||
|
add_packages("matplotplusplus")
|
||||||
|
|
||||||
add_tests("compile_and_run")
|
add_tests("compile_and_run")
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user