lib_math/labo01/MatrixBase.h

368 lines
6.5 KiB
C
Raw Normal View History

2024-01-18 10:53:15 -05:00
#pragma once
/**
* @file MatrixBase.h
*
* @brief Classe contenant les éléments de base des matrices et des vecteurs.
*
2024-01-23 21:00:14 -05:00
* Nom: William Nolin
* Code permanent : NOLW76060101
* Email : william.nolin.1@ens.etsmtl.ca
2024-01-18 10:53:15 -05:00
*
*/
#include "DenseStorage.h"
namespace gti320
{
/**
* Classe de base pour les matrices et vecteurs à taille fixe.
*/
template <typename _Scalar, int _Rows, int _Cols>
class MatrixBase
{
protected:
DenseStorage<_Scalar, _Rows* _Cols> m_storage;
public:
typedef _Scalar Scalar;
/**
* Constructeur par défaut
*/
MatrixBase() : m_storage() { }
/**
* Constructeur de copie
*/
2024-02-13 21:38:14 -05:00
MatrixBase(const MatrixBase& other) : m_storage(other.m_storage) {
}
2024-01-18 10:53:15 -05:00
2024-02-13 21:38:14 -05:00
explicit MatrixBase(int _rows, int _cols) : m_storage() {
setZero();
}
2024-01-18 10:53:15 -05:00
/**
* Destructeur
*/
2024-01-23 21:00:14 -05:00
~MatrixBase() {
}
2024-01-18 10:53:15 -05:00
/**
* Redimensionne la matrice
*/
void resize(int _rows, int _cols)
{
// Ne rien faire.
}
/**
* Opérateur de copie
*/
MatrixBase& operator=(const MatrixBase& other)
{
if (this != &other)
{
m_storage = other.m_storage;
}
return *this;
}
inline void setZero() { m_storage.setZero(); }
static inline int cols() { return _Cols; }
static inline int rows() { return _Rows; }
/**
* Accès à la donnée membre de stockage (en lecture seule)
*/
const DenseStorage<_Scalar, _Rows* _Cols>& storage() const
{
return m_storage;
}
/**
* Nombre d'éléments stockés dans le tampon.
*/
inline int size() const
{
return m_storage.size();
}
/**
* Accès au tampon de données ((lecture seule))
*/
const _Scalar* data() const
{
return m_storage.data();
}
};
/**
* Classe de base pour les matrices avec un nombre de lignes dynamique et un
* nombre fixe de colonnes.
*/
template <typename _Scalar, int _Cols>
class MatrixBase<_Scalar, Dynamic, _Cols>
{
protected:
DenseStorage<_Scalar, Dynamic> m_storage;
int m_rows;
public:
typedef _Scalar Scalar;
/**
* Constructeur par défaut
*/
MatrixBase() : m_storage(), m_rows(0) { }
2024-02-13 21:38:14 -05:00
explicit MatrixBase(int _rows, int _cols) : m_storage(_rows* _Cols), m_rows(_rows) {
setZero();
}
2024-01-18 10:53:15 -05:00
/**
* Constructeur de copie
*/
MatrixBase(const MatrixBase& other) : m_storage(other.m_storage), m_rows(other.m_rows) { }
/**
* Destructeur
*/
~MatrixBase() { }
/**
* Opérateur de copie
*/
MatrixBase& operator=(const MatrixBase& other)
{
if (this != &other)
{
m_storage = other.m_storage;
m_rows = other.m_rows;
}
return *this;
}
/**
* Redimensionne la matrice
*/
void resize(int _rows, int _cols)
{
assert(_cols == _Cols);
m_storage.resize(_rows * _Cols);
m_rows = _rows;
}
inline void setZero() { m_storage.setZero(); }
static inline int cols() { return _Cols; }
inline int rows() const { return m_rows; }
/**
* Accès à la donnée membre de stockage (en lecture seule)
*/
const DenseStorage<_Scalar, Dynamic>& storage() const
{
return m_storage;
}
/**
* Nombre d'éléments stockés dans le tampon.
*/
inline int size() const
{
return m_storage.size();
}
/**
* Accès au tampon de données ((lecture seule))
*/
const _Scalar* data() const
{
return m_storage.data();
}
};
/**
* Classe de base pour les matrices avec un nombre fixe de lignes et un
* nombre de colonnes dynamique.
*/
template <typename _Scalar, int _Rows>
class MatrixBase<_Scalar, _Rows, Dynamic>
{
protected:
DenseStorage<_Scalar, Dynamic> m_storage;
int m_cols;
public:
typedef _Scalar Scalar;
/**
* Constructeur par défaut
*/
MatrixBase() : m_storage() { }
2024-02-13 21:38:14 -05:00
explicit MatrixBase(int _rows, int _cols) : m_storage(_rows* _cols), m_cols(_cols) {
setZero();
}
2024-01-18 10:53:15 -05:00
/**
* Constructeur de copie
*/
MatrixBase(const MatrixBase& other) : m_storage(other.m_storage), m_cols(other.m_cols) { }
/**
* Destructeur
*/
~MatrixBase() { }
/**
* Opérateur de copie
*/
MatrixBase& operator=(const MatrixBase& other)
{
if (this != &other) {
m_storage = other.m_storage;
m_cols = other.m_cols;
}
return *this;
}
/**
* Redimensionne la matrice
*/
void resize(int _rows, int _cols)
{
assert(_rows == _Rows);
m_storage.resize(_Rows * _cols);
m_cols = _cols;
}
inline void setZero() { m_storage.setZero(); }
inline int cols() const { return m_cols; }
static inline int rows() { return _Rows; }
/**
* Accès à la donnée membre de stockage (en lecture seule)
*/
const DenseStorage<_Scalar, Dynamic>& storage() const
{
return m_storage;
}
/**
* Nombre d'éléments stockés dans le tampon.
*/
inline int size() const
{
return m_storage.size();
}
/**
* Accès au tampon de données ((lecture seule))
*/
const _Scalar* data() const
{
return m_storage.data();
}
};
/**
* Classe de base pour les matrices avec un nombre de lignes et de colonnes
* dynamiques.
*/
template <typename _Scalar>
class MatrixBase<_Scalar, Dynamic, Dynamic>
{
protected:
DenseStorage<_Scalar, Dynamic> m_storage;
int m_cols;
int m_rows;
public:
typedef _Scalar Scalar;
/**
* Constructeur par défaut
*/
MatrixBase() : m_storage(), m_rows(0), m_cols(0) { }
2024-02-13 21:38:14 -05:00
explicit MatrixBase(int _rows, int _cols) : m_storage(_rows* _cols), m_rows(_rows), m_cols(_cols) {
setZero();
}
2024-01-18 10:53:15 -05:00
/**
* Constructeur de copie
*/
MatrixBase(const MatrixBase& other) : m_storage(other.m_storage), m_rows(other.m_rows), m_cols(other.m_cols) { }
/**
* Destructeur
*/
~MatrixBase() { }
/**
* Opérateur de copie
*/
MatrixBase& operator=(const MatrixBase& other)
{
if (this != &other)
{
resize(other.m_rows, other.m_cols);
m_storage = other.m_storage;
}
return *this;
}
/**
* Redimensionne la matrice
*/
void resize(int _rows, int _cols)
{
m_storage.resize(_rows * _cols);
m_rows = _rows;
m_cols = _cols;
}
inline void setZero() { m_storage.setZero(); }
inline int cols() const { return m_cols; }
inline int rows() const { return m_rows; }
/**
* Accès à la donnée membre de stockage (en lecture seule)
*/
const DenseStorage<_Scalar, Dynamic>& storage() const
{
return m_storage;
}
/**
* Nombre d'éléments stockés dans le tampon.
*/
inline int size() const
{
return m_storage.size();
}
/**
* Accès au tampon de données ((lecture seule))
*/
const _Scalar* data() const
{
return m_storage.data();
}
};
}