Compare commits

..

3 Commits

Author SHA1 Message Date
2b520f6648 better matrix doc
All checks were successful
Linux arm64 / Build (push) Successful in 9m48s
2024-03-03 12:30:43 +01:00
57d51a1406 better Intellisense on vscode 2024-03-03 12:20:11 +01:00
3d01393f02 add IsElementOf + ColumnVector 2024-03-03 12:16:26 +01:00
6 changed files with 111 additions and 8 deletions

10
.vscode/c_cpp_properties.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"configurations": [
{
"name": "Pivot",
"cppStandard": "c++17",
"includePath": ["include"]
}
],
"version": 4
}

View File

@@ -37,7 +37,11 @@ class Matrix {
Matrix(std::size_t raws, std::size_t columns); Matrix(std::size_t raws, std::size_t columns);
/** /**
* \brief Construit une matrice de taille donnée avec des éléments donnés * \brief Construit une matrice de taille donnée avec des éléments donnés.\n
* Exemple :
* \code Matrix(2, 2, {1, 2, 3, 4}) \endcode construit la matrice \n
* [1, 2]\n
* [3, 4]
* \param raws Le nombre de lignes * \param raws Le nombre de lignes
* \param columns Le nombre de colonne * \param columns Le nombre de colonne
* \param initList Les élements à mettre * \param initList Les élements à mettre
@@ -79,6 +83,9 @@ class Matrix {
*/ */
Matrix SubMatrix(std::size_t raw_origin, std::size_t column_origin, std::size_t raw, std::size_t column) const; Matrix SubMatrix(std::size_t raw_origin, std::size_t column_origin, std::size_t raw, std::size_t column) const;
Matrix operator+(const Matrix& other) const;
Matrix operator-(const Matrix& other) const;
bool operator==(const Matrix& other) const; bool operator==(const Matrix& other) const;
/** /**
@@ -105,6 +112,16 @@ class Matrix {
* \param size La taille de la matrice carrée * \param size La taille de la matrice carrée
*/ */
static Matrix Identity(std::size_t size); static Matrix Identity(std::size_t size);
/**
* \brief Construit une matrice colonne à partir de données existantes.\n
* Exemple :
* \code
* Matrix::ColumnVector({1, 2, 3, 4});
* \endcode
* construit une matrice de 4 lignes et 1 colonne de coordonnées (1, 2, 3, 4)
*/
static Matrix ColumnVector(std::initializer_list<Element>&&);
}; };
template <typename T> template <typename T>

View File

@@ -48,9 +48,15 @@ class Vect {
/** /**
* \brief Concatène la base actuelle avec un nouveau vecteur * \brief Concatène la base actuelle avec un nouveau vecteur
* \param mat Une matrice colonne de taille GetDimension() * \param vec Une matrice colonne de taille GetDimension()
*/ */
void AddVector(const Matrix& mat); void AddVector(const Matrix& vec);
/**
* \brief Vérifie si le vecteur spécifié appartient au sous-espace vectoriel
* \param vec Une matrice colonne représentant le vecteur à tester
*/
bool IsElementOf(const Matrix& vec) const;
bool operator==(const Vect& other) const; bool operator==(const Vect& other) const;
bool operator!=(const Vect& other) const; bool operator!=(const Vect& other) const;
@@ -90,4 +96,14 @@ class VectAffine {
const Matrix& GetOrigin() const { const Matrix& GetOrigin() const {
return m_Origin; return m_Origin;
} }
/**
* \brief Vérifie si le vecteur spécifié appartient à l'espace affine
* \param vec Une matrice colonne représentant le vecteur à tester
*/
bool IsElementOf(const Matrix& vec) const;
bool operator==(const VectAffine& vect) const {
return m_Origin == vect.GetOrigin() && m_Base == vect.GetBase();
};
}; };

View File

@@ -57,6 +57,14 @@ Matrix Matrix::Identity(std::size_t taille) {
return id; return id;
} }
Matrix Matrix::ColumnVector(std::initializer_list<Element>&& initList) {
Matrix result {initList.size(), 1};
result.m_Data = initList;
return result;
}
void Matrix::Augment(const Matrix& droite) { void Matrix::Augment(const Matrix& droite) {
assert(droite.m_Raws == m_Raws); assert(droite.m_Raws == m_Raws);
Matrix temp {m_Raws, m_Columns + droite.m_Columns}; Matrix temp {m_Raws, m_Columns + droite.m_Columns};
@@ -76,6 +84,34 @@ void Matrix::Augment(const Matrix& droite) {
*this = temp; *this = temp;
} }
Matrix Matrix::operator+(const Matrix& other) const {
assert(GetColumnCount() == other.GetColumnCount() && GetRawCount() == other.GetRawCount());
Matrix result = *this;
for (std::size_t i = 0; i < GetRawCount(); i++) {
for (std::size_t j = 0; j < GetColumnCount(); j++) {
result.at(i, j) += other.at(i, j);
}
}
return result;
}
Matrix Matrix::operator-(const Matrix& other) const {
assert(GetColumnCount() == other.GetColumnCount() && GetRawCount() == other.GetRawCount());
Matrix result = *this;
for (std::size_t i = 0; i < GetRawCount(); i++) {
for (std::size_t j = 0; j < GetColumnCount(); j++) {
result.at(i, j) -= other.at(i, j);
}
}
return result;
}
bool Matrix::operator==(const Matrix& other) const { bool Matrix::operator==(const Matrix& other) const {
if (m_Raws != other.m_Raws || m_Columns != other.m_Columns) if (m_Raws != other.m_Raws || m_Columns != other.m_Columns)
return false; return false;

View File

@@ -37,15 +37,19 @@ std::size_t Vect::GetCardinal() const {
return m_Data.GetColumnCount(); return m_Data.GetColumnCount();
} }
bool Vect::IsElementOf(const Matrix& vec) const {
Vect base = *this;
base.AddVector(vec);
return base.GetCardinal() == GetCardinal();
}
bool Vect::operator==(const Vect& other) const { bool Vect::operator==(const Vect& other) const {
if (GetDimension() != other.GetDimension() || GetCardinal() != other.GetCardinal()) if (GetDimension() != other.GetDimension() || GetCardinal() != other.GetCardinal())
return false; return false;
// on vérifie si chaque vecteur de la deuxième base appartient à l'espace vectoriel engendré par la première base // on vérifie si chaque vecteur de la deuxième base appartient à l'espace vectoriel engendré par la première base
for (std::size_t i = 0; i < GetCardinal(); i++) { for (std::size_t i = 0; i < GetCardinal(); i++) {
Vect base = *this; if (!IsElementOf(other.GetVector(i)))
base.AddVector(other.m_Data.SubMatrix(0, i, GetDimension(), 1));
if (base.GetCardinal() != GetCardinal())
return false; return false;
} }
return true; return true;
@@ -79,3 +83,7 @@ std::size_t Vect::GetDimension() const {
VectAffine::VectAffine(const Vect& base, const Matrix& origine) : VectAffine::VectAffine(const Vect& base, const Matrix& origine) :
m_Base(base), m_Origin(origine.SubMatrix(0, 0, m_Base.GetDimension(), 1)) {} m_Base(base), m_Origin(origine.SubMatrix(0, 0, m_Base.GetDimension(), 1)) {}
bool VectAffine::IsElementOf(const Matrix& vec) const {
return m_Base.IsElementOf(vec - m_Origin);
}

View File

@@ -1,7 +1,7 @@
#include "Vect.h" #include "Vect.h"
#include <cassert> #include <cassert>
int main() { void TestVect() {
Vect vect1 {{3, 2, { Vect vect1 {{3, 2, {
1, 2, 1, 2,
3, 4, 3, 4,
@@ -27,5 +27,21 @@ int main() {
assert(vect1 != vect2); assert(vect1 != vect2);
assert(vect2 != vect3); assert(vect2 != vect3);
assert(vect3 != vect4); assert(vect3 != vect4);
assert(vect1.IsElementOf(Matrix::ColumnVector({3, 7, 11})));
assert(!vect1.IsElementOf(Matrix::ColumnVector({3, 7, 12})));
}
void TestVectAffine() {
VectAffine aff {Matrix {3, 1, {-2, 3, 7}}, Matrix::ColumnVector({5, 2, -8})};
assert(aff.IsElementOf(Matrix::ColumnVector({5, 2, -8})));
assert(aff.IsElementOf(Matrix::ColumnVector({3, 5, -1})));
assert(!aff.IsElementOf(Matrix::ColumnVector({1, 2, 3})));
}
int main() {
TestVect();
TestVectAffine();
return 0; return 0;
} }