lib_math/labo01/Operators.h

254 lines
8.4 KiB
C
Raw Normal View History

2024-01-18 10:53:15 -05:00
#pragma once
/**
* @file Operators.h
*
* @brief Opérateurs arithmétiques pour les matrices et les vecteurs.
*
2024-01-26 19:22:09 -05:00
* Nom: William Nolin
* Code permanent : NOLW76060101
* Email : william.nolin.1@ens.etsmtl.ca
2024-01-18 10:53:15 -05:00
*
*/
#include "Matrix.h"
#include "Vector.h"
2024-01-29 12:00:30 -05:00
/**
* Implémentation de divers opérateurs arithmétiques pour les matrices et les vecteurs.
*/
2024-01-18 10:53:15 -05:00
namespace gti320 {
2024-01-29 12:00:30 -05:00
/**
* Multiplication : Matrice * Matrice (générique)
*/
template<typename _Scalar, int RowsA, int ColsA, int StorageA, int RowsB, int ColsB, int StorageB>
Matrix<_Scalar, RowsA, ColsB>
operator*(const Matrix<_Scalar, RowsA, ColsA, StorageA> &A, const Matrix<_Scalar, RowsB, ColsB, StorageB> &B) {
assert(A.cols() == B.rows());
auto result = Matrix<_Scalar, Dynamic, Dynamic>(A.rows(), B.cols());
for (int col = 0; col < B.cols(); col++) {
for (int row = 0; row < A.rows(); row++) {
for (int k = 0; k < A.cols(); k++) {
2024-01-29 14:27:22 -05:00
result(row, col) += A(row, k) * B(k, col);
2024-01-29 12:00:30 -05:00
}
}
}
return result;
}
/**
* Multiplication : Matrice (colonne) * Matrice (ligne)
*
* Spécialisation de l'opérateur de multiplication pour le cas les matrices
* ont un stockage à taille dynamique et la matrice de gauche utilise un
* stockage par colonnes et celle de droite un stockage par lignes.
*/
template<typename _Scalar>
Matrix<_Scalar, Dynamic, Dynamic> operator*(const Matrix<_Scalar, Dynamic, Dynamic, ColumnStorage> &A,
const Matrix<_Scalar, Dynamic, Dynamic, RowStorage> &B) {
assert(A.cols() == B.rows());
auto result = Matrix<_Scalar, Dynamic, Dynamic>(A.rows(), B.cols());
for (int col = 0; col < A.cols(); col++) {
for (int row = 0; row < B.rows(); row++) {
for (int k = 0; k < B.cols(); k++) {
2024-01-29 14:27:22 -05:00
result(row, k) += A(row, col) * B(col, k);
2024-01-29 12:00:30 -05:00
}
}
}
return result;
}
/**
* Multiplication : Matrice (ligne) * Matrice (colonne)
*
* Spécialisation de l'opérateur de multiplication pour le cas les matrices
* ont un stockage à taille dynamique et la matrice de gauche utilise un
* stockage par lignes et celle de droite un stockage par colonnes.
*/
template<typename _Scalar>
Matrix<_Scalar, Dynamic, Dynamic> operator*(const Matrix<_Scalar, Dynamic, Dynamic, RowStorage> &A,
const Matrix<_Scalar, Dynamic, Dynamic, ColumnStorage> &B) {
assert(A.cols() == B.rows());
auto result = Matrix<_Scalar, Dynamic, Dynamic>(A.rows(), B.cols());
for (int col = 0; col < B.cols(); col++) {
for (int row = 0; row < A.rows(); row++) {
for (int k = 0; k < A.cols(); k++) {
2024-01-29 14:27:22 -05:00
result(row, col) += A(row, k) * B(k, col);
2024-01-29 12:00:30 -05:00
}
}
}
return result;
}
/**
* Addition : Matrice + Matrice (générique)
*/
template<typename _Scalar, int Rows, int Cols, int StorageA, int StorageB>
Matrix<_Scalar, Rows, Cols>
operator+(const Matrix<_Scalar, Rows, Cols, StorageA> &A, const Matrix<_Scalar, Rows, Cols, StorageB> &B) {
assert(A.rows() == B.rows());
assert(A.cols() == B.cols());
auto result = Matrix<_Scalar, Rows, Cols, StorageA>(A.rows(), A.cols());
for (int row = 0; row < A.rows(); row++) {
for (int col = 0; col < A.cols(); col++) {
result(row, col) = A(row, col) + B(row, col);
}
}
return result;
}
/**
* Addition : Matrice (colonne) + Matrice (colonne)
*
* Spécialisation de l'opérateur d'addition pour le cas les deux matrices
* sont stockées par colonnes.
*/
template<typename _Scalar>
Matrix<_Scalar, Dynamic, Dynamic> operator+(const Matrix<_Scalar, Dynamic, Dynamic, ColumnStorage> &A,
const Matrix<_Scalar, Dynamic, Dynamic, ColumnStorage> &B) {
assert(A.rows() == B.rows());
assert(A.cols() == B.cols());
auto result = Matrix<_Scalar, Dynamic, Dynamic, ColumnStorage>(A.rows(), A.cols());
for (int col = 0; col < A.cols(); col++) {
for (int row = 0; row < A.rows(); row++) {
2024-01-29 14:27:22 -05:00
result(col, row) = A(col, row) + B(col, row);
2024-01-29 12:00:30 -05:00
}
}
return result;
}
/**
* Addition : Matrice (ligne) + Matrice (ligne)
*
* Spécialisation de l'opérateur d'addition pour le cas les deux matrices
* sont stockées par lignes.
*/
template<typename _Scalar>
Matrix<_Scalar, Dynamic, Dynamic, RowStorage> operator+(const Matrix<_Scalar, Dynamic, Dynamic, RowStorage> &A,
const Matrix<_Scalar, Dynamic, Dynamic, RowStorage> &B) {
assert(A.rows() == B.rows());
assert(A.cols() == B.cols());
auto result = Matrix<_Scalar, Dynamic, Dynamic, RowStorage>(A.rows(), A.cols());
for (int row = 0; row < A.rows(); row++) {
for (int col = 0; col < A.cols(); col++) {
result(row, col) = A(row, col) + B(row, col);
}
}
return result;
}
/**
* Multiplication : Scalaire * Matrice (colonne)
*
* Spécialisation de l'opérateur de multiplication par un scalaire pour le
* cas d'une matrice stockée par colonnes.
*/
template<typename _Scalar, int _Rows, int _Cols>
Matrix<_Scalar, _Rows, _Cols, ColumnStorage>
operator*(const _Scalar &a, const Matrix<_Scalar, _Rows, _Cols, ColumnStorage> &A) {
auto result = Matrix<_Scalar, _Rows, _Cols, ColumnStorage>(A.rows(), A.cols());
for (int col = 0; col < A.cols(); col++) {
for (int row = 0; row < A.rows(); row++) {
result(col, row) = a * A(col, row);
}
}
return result;
}
/**
* Multiplication : Scalaire * Matrice (ligne)
*
* Spécialisation de l'opérateur de multiplication par un scalaire pour le
* cas d'une matrice stockée par lignes.
*/
template<typename _Scalar, int _Rows, int _Cols>
Matrix<_Scalar, _Rows, _Cols, RowStorage>
operator*(const _Scalar &a, const Matrix<_Scalar, _Rows, _Cols, RowStorage> &A) {
auto result = Matrix<_Scalar, _Rows, _Cols, RowStorage>(A.rows(), A.cols());
for (int row = 0; row < A.rows(); row++) {
for (int col = 0; col < A.cols(); col++) {
result(col, row) = a * A(col, row);
}
}
return result;
}
/**
* Multiplication : Matrice (ligne) * Vecteur
*
* Spécialisation de l'opérateur de multiplication matrice*vecteur pour le
* cas la matrice est représentée par lignes.
*/
template<typename _Scalar, int _Rows, int _Cols>
Vector<_Scalar, _Rows>
operator*(const Matrix<_Scalar, _Rows, _Cols, RowStorage> &A, const Vector<_Scalar, _Cols> &v) {
// TODO : implémenter
return Vector<_Scalar, _Rows>();
}
/**
* Multiplication : Matrice (colonne) * Vecteur
*
* Spécialisation de l'opérateur de multiplication matrice*vecteur pour le
* cas la matrice est représentée par colonnes.
*/
template<typename _Scalar, int _Rows, int _Cols>
Vector<_Scalar, _Rows>
operator*(const Matrix<_Scalar, _Rows, _Cols, ColumnStorage> &A, const Vector<_Scalar, _Cols> &v) {
// TODO : implémenter
return Vector<_Scalar, _Rows>();
}
/**
* Multiplication : Scalaire * Vecteur
*/
template<typename _Scalar, int _Rows>
Vector<_Scalar, _Rows> operator*(const _Scalar &a, const Vector<_Scalar, _Rows> &v) {
// TODO : implémenter
return Vector<_Scalar, _Rows>();
}
/**
* Addition : Vecteur + Vecteur
*/
template<typename _Scalar, int _RowsA, int _RowsB>
Vector<_Scalar, _RowsA> operator+(const Vector<_Scalar, _RowsA> &a, const Vector<_Scalar, _RowsB> &b) {
// TODO : implémenter
return Vector<_Scalar, _RowsA>();
}
/**
* Soustraction : Vecteur - Vecteur
*/
template<typename _Scalar, int _RowsA, int _RowsB>
Vector<_Scalar, _RowsA> operator-(const Vector<_Scalar, _RowsA> &a, const Vector<_Scalar, _RowsB> &b) {
// TODO : implémenter
return Vector<_Scalar, _RowsA>();
}
2024-01-18 10:53:15 -05:00
}