#pragma once /** * @file Operators.h * * @brief Opérateurs arithmétiques pour les matrices et les vecteurs. * * Nom: William Nolin * Code permanent : NOLW76060101 * Email : william.nolin.1@ens.etsmtl.ca * */ #include "Matrix.h" #include "Vector.h" /** * Implémentation de divers opérateurs arithmétiques pour les matrices et les vecteurs. */ namespace gti320 { /** * Multiplication : Matrice * Matrice (générique) */ template 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++) { result(col, row) += A(k, row) * B(col, k); } } } return result; } /** * Multiplication : Matrice (colonne) * Matrice (ligne) * * Spécialisation de l'opérateur de multiplication pour le cas où les matrices * ont un stockage à taille dynamique et où la matrice de gauche utilise un * stockage par colonnes et celle de droite un stockage par lignes. */ template 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++) { result(k, row) += A(col, row) * B(k, col); } } } return result; } /** * Multiplication : Matrice (ligne) * Matrice (colonne) * * Spécialisation de l'opérateur de multiplication pour le cas où les matrices * ont un stockage à taille dynamique et où la matrice de gauche utilise un * stockage par lignes et celle de droite un stockage par colonnes. */ template 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++) { result(col, row) += A(k, row) * B(col, k); } } } return result; } /** * Addition : Matrice + Matrice (générique) */ template 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 où les deux matrices * sont stockées par colonnes. */ template 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++) { result(row, col) = A(row, col) + B(row, col); } } return result; } /** * Addition : Matrice (ligne) + Matrice (ligne) * * Spécialisation de l'opérateur d'addition pour le cas où les deux matrices * sont stockées par lignes. */ template 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 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 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 où la matrice est représentée par lignes. */ template 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 où la matrice est représentée par colonnes. */ template 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 Vector<_Scalar, _Rows> operator*(const _Scalar &a, const Vector<_Scalar, _Rows> &v) { // TODO : implémenter return Vector<_Scalar, _Rows>(); } /** * Addition : Vecteur + Vecteur */ template 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 Vector<_Scalar, _RowsA> operator-(const Vector<_Scalar, _RowsA> &a, const Vector<_Scalar, _RowsB> &b) { // TODO : implémenter return Vector<_Scalar, _RowsA>(); } }