Engineering School, 2nd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

285 lines
6.6 KiB

/**
* #(@)Matrix.h ENSICAEN 2005-10-12
*
* @author MASSE Nicolas (2005-Groupe4-LIMIN) <nicolas27.masse@laposte.net>
* @author LIMIN Thomas (2005-Groupe4-MASSE) <thomas.limin@laposte.net>
*
* ENSICAEN
* 6 Boulevard Marechal Juin
* F-14050 Caen Cedex
*
* Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre
* reproduit, utilise ou modifie sans l'avis express de ses auteurs.
*/
/**
* Objectifs du TP: allocation dynamique, copie et destruction des objets,
* surcharge d'operateurs, programmation d'une classe concrète, CHoix entre
* fonctions membres, non-membres,
*/
/*
* @version 0.0.1
*
* @done: nothing
*
* @todo: all
*/
#ifndef __MATRIX_H__
#define __MATRIX_H__
#include <cassert>
#include <iostream>
using namespace std;
/**
* A class wich implements the mathematical concept of Matrix
*/
class Matrix {
public:
/**
* Default constructor. The caller has to provide the
* size of the future matrix.
*
* @param line_nb number of line, default 2
* @param col_nb number of column, default 2
*/
Matrix(unsigned int line_nb = 2, unsigned int col_nb = 2);
/**
* Clone constructor
*
* @param m original matrix
*/
Matrix(const Matrix & m);
/**
* Matrix destructor. Free memory that is used to store
* the coeficient.
*/
~Matrix();
/**
* Assignment operator.
*
* @param m original matrix
* @retun a reference on the matrix' copy
*/
Matrix & operator=(const Matrix & m);
/**
* Equality check operator.
*
* @param m second matrix
* @retun true if the matrices are identical, else false
*/
bool operator==(const Matrix & m) const;
/**
* Inequality check operator.
*
* @param m second matrix
* @retun true if the matrices are different, else true
*/
bool operator!=(const Matrix & m) const;
/**
* Addition operator.
*
* @param m second matrix
* @return the addition of the two matrix
*/
Matrix operator+(const Matrix & m) const;
/**
* Addition and affectation operator.
*
* @param m second matrix
* @return a reference to this
*/
Matrix & operator+=(const Matrix & m);
/**
* Minus operator.
*
* @param m second matrix
* @return the difference between the two matrix
*/
Matrix operator-(const Matrix & m) const;
/**
* Minus and affectation operator.
*
* @param m second matrix
* @return a reference to this
*/
Matrix & operator-=(const Matrix & m);
/**
* Unary minus operator.
*
* @return a new matrix
*/
Matrix operator-() const;
/**
* Transposes this matrix.
*
* @return a new transposed matrix.
*/
Matrix transpose() const;
/**
* Invert the Matrix. This is the entry point for the recursive
* inversion process. It init the matrix so it will be inversible
*
* @return a new matrix, inverted
*/
Matrix invert() const;
/**
* Multiply operator.
*
* @param m the second matrix.
* @return the result.
*/
Matrix operator*(const Matrix & m) const;
/**
* Return a pointer linked to the previous element of the first element
* of the row, so that the notation m[row][col] works (with row in [1,n]
* and col in [1,n].
*
* @param row the row number (between 1 and _line_nb).
* @return a pointer to the row.
*/
inline double * operator[](unsigned int row) {
assert(row > 0 && row <= this->getLineNb());
return _lines[row - 1] - 1;
}
/**
* Number of lines getter
*
* @return the number of lines
*/
inline unsigned int getLineNb() const {
return _line_nb;
}
/**
* Number of columns getter
*
* @return the number of comumns
*/
inline unsigned int getColNb() const {
return _col_nb;
}
/**
* Matrix values getter.
*
* @param r the row number [1,n]
* @param c the col number [1,n]
* @return the value.
*/
inline double getValueAt(unsigned int r, unsigned int c) const {
assert(r > 0 && r <= _line_nb);
assert(c > 0 && c <= _col_nb);
return _lines[r - 1][c - 1];
}
/**
* Matrix values setter.
*
* @param r the row number [1,n]
* @param c the col number [1,n]
* @param v the value.
*/
inline void setValueAt(unsigned int r, unsigned int c, double v) {
assert(r > 0 && r <= _line_nb);
assert(c > 0 && c <= _col_nb);
_lines[r - 1][c - 1] = v;
}
/**
* Create a Matrix which is a copy of a quarter of the current Matrix
* The returned quarter is:
*
* 1 => up left
* 2 => up right
* 3 => down right
* 4 => down left
*
* @param quarter the quarter to return
* @return a new Matrix
*/
Matrix getQuarter(int quarter) const;
private:
/**
* Inverts this matrix (recursive)
*
* @return a new inverted matrix.
*/
Matrix invertR() const;
/**
* The number of line of the matrix
*/
unsigned int _line_nb;
/**
* The number of line of the matrix
*/
unsigned int _col_nb;
/**
* An array of pointers, each allowing access to a column
*/
double ** _lines;
/**
* Memory area in wich columns are stored
*/
double * _columns;
};
/**
* Write a Matrix to output stream. Following format is used:
* line_number column number values (line by line)
*
* @param os the output stream
* @param m the matrix to write out
* @return the output stream
*/
ostream & operator<<(ostream & os, const Matrix & m);
/**
* Get a Matrix from input stream. Following format is used:
* line_number column number values (line by line)
*
* @param is the input stream
* @param m a pointer on a Matrix pointer. the param is used
* to write out the pointer to the new Matrix
* @return the input stream
*/
istream & operator>>(istream & is, Matrix ** m);
/**
* Tests if n is a power of two.
*
* @param n the number to test.
* @param max a pointer to store the power of two upper or equal to n
* @return true or false.
*/
bool isPowerOfTwo(unsigned int n, unsigned int * max);
#endif /* define __MATRIX_H__ */