Matrix Library. v1.6.4 + some changes
Diff: Matrix.h
- Revision:
- 2:493402568a5e
- Parent:
- 1:48f417da268e
- Child:
- 3:589fb80932b5
--- a/Matrix.h Mon Sep 26 03:23:35 2011 +0000 +++ b/Matrix.h Thu Oct 20 23:42:13 2011 +0000 @@ -10,35 +10,21 @@ */ #ifndef MATRIX_H -#define MATRIX_H +#define MATRIX_H + #include <vector> +class MatrixMath; + using namespace std; - /** - * @brief This class is intended to provide basic functionality to a Matrix like vector - * it's meant for float elements. - * - * IMPORTAT: Asignment "=" operator is overloaded so that it resizes the 'lefthand' Matrix - * to acomodate the Matrix it's been passed. - * - * An example of how it works: - * @code - * Matrix myMatrix( 3, 4 ); //Declare a 3 Rows by 4 Columns Matrix. + * @brief This class provide basic manipulation for 2D matrices. * - * myMatrix.Fill(); // Fill the matrix using printf() and scanf(). - * myMatrix.print(); // Prints the value of the Matrix. printf() + * Intended to be ported to mbed.org * - * Matrix::DeleteCol( myMatrix, 2 ); //Deletes Second Column. (startin' with 1 not 0) - * myMatrix.print(); // Re-prints Matrix - * - * Matrix anotherMatrix (3); // Squared 3x3 Matrix - * anotherMatrix = myMatrix; // Re-Sizes 'anotherMatrix' to fit myMatrix and copies data. - * anotherMatrix += myMatrix; // Adds one-by-one elements and saves to anotherMatrix - * anotherMatrix.print(); - * @endcode - * + * v1.01 + * */ class Matrix{ public: @@ -46,34 +32,38 @@ /// Creates a nex Matrix of Size [ Row x Cols ] Matrix( int Rows, int Cols ); - /// Creats a Square Matrix o Size [ Rows x Rows ] - Matrix( int Rows ); - - /// Creates a new Matrix identical in size to an input Matrix - Matrix( const Matrix &base ); + /// Creates a new Matrix identical to an input Matrix + Matrix( const Matrix& base ); /// Reserves Memory for a New Matrix Matrix(); +/******************************************************************************/ /** @brief * This is the '=' Overloaded operator. It RESIZES assigned the matrix. * Overwrites all data. To be used Carefully! */ - Matrix& operator = ( const Matrix &rightM ); + Matrix& operator = ( const Matrix& rightM ); + + + + /**@brief This includes the Class to handle Matrix Operations. + */ + friend class MatrixMath; - + /** @brief * Overload opeartor for the compare Matrices * * @param rightM * @return Boolean 'false' if different. */ - bool operator == ( const Matrix &rightM ); + bool operator == ( const Matrix& rightM ); @@ -83,16 +73,16 @@ * @param rightM * @return Boolean 'true' if different */ - bool operator != ( const Matrix &rightM ); + bool operator != ( const Matrix& rightM ); - - + + /** @brief * Overload Copmpound assignment. * @param rightM * @return A new Matrix to be assigned to itself. */ - Matrix& operator += ( const Matrix &rightM ); + Matrix& operator += ( const Matrix& rightM ); @@ -101,28 +91,142 @@ * @param rightM Right hand matrix * @return A new Matrix to be assigned to itself */ - Matrix& operator -= ( const Matrix &rightM ); + Matrix& operator -= ( const Matrix& rightM ); + + + + /** @brief + * Overload Compound CrossProduct Matrix operation. + * @param rightM + * @return + */ + Matrix& operator *=( const Matrix& rightM ); + + + + /** @brief + * Overload Compund Element-by-elemnt scalar multiplication. + * @param number + * @return + */ + Matrix& operator *=( float number ); + + + + /**@brief + * Makes all elements in matrix negative. + * Unary operator + * @return A new Matrix object with inverted values. + */ + const Matrix operator -(); + + + + /**@brief + * Overload Compound add with scalar. + * Because the '=' operator checks for self Assign, no extra operations + * are needed. + * @return Same Matrix to self Assign. + */ + friend const Matrix operator +=( Matrix& leftM, float number ); + + + + /**@brief + * Compound substract with scalar. + * @return Same matrix to self Assign. + */ + friend const Matrix operator -=( Matrix& leftM, float number ); + + + + /** @brief + * Adds two matrices of the same dimensions, element-by-element. + * If diferent dimensions -> ERROR. + * @return A new object Matrix with the result. + */ + friend const Matrix operator +( const Matrix& leftM, const Matrix& rightM); /** @brief - * Overloads the Plus, returns a new object. - * @param rightM right side Matrix - * @return Retuns an instance of the answer. + * Adds the given nomber to each element of matrix. + * Mimic MATLAB operation. + * @return A new matrix object with the result. + */ + friend const Matrix operator +( const Matrix& leftM, float number ); + + + + /**@brief + * Adds the given number to each element in Matrix. + * @return A new Matrix object with the result. + */ + friend const Matrix operator +( float number, const Matrix& leftM ); + + + + /**@brief + * Substracts two matrices of the same size, element-by-element. + * If different dimensions -> ERROR. + * @return A new object Matrix with the result. + */ + friend const Matrix operator -( const Matrix& leftM, const Matrix& rightM ); + + + + /**@brief + * Substracts each element in Matrix by number. + * @return A new matrix object with the result. */ - const Matrix operator +( const Matrix &rightM ); + friend const Matrix operator -( const Matrix& leftM, float number ); + + + + /**@brief + * Substracts each element in Matrix by number + * @return A new matrix object with the result. + */ + friend const Matrix operator -( float number, const Matrix& leftM ); + + + + /** + * Preforms Crossproduct between two matrices. + * @return + */ + friend const Matrix operator *( const Matrix& leftM, const Matrix& rightM ); + + + + /**@brief + * Multiplies a scalar number with each element on Matrix. + * @return A new object with the result. + */ + friend const Matrix operator *( const Matrix& leftM, float number ); + + + + /**@brief + * Multiplies a scalar number with each element on Matrix. + * @return + */ + friend const Matrix operator *( float number, const Matrix& leftM ); + + /**@brief + * Inputs numbres into a Matrix, the matrix needs to be costructed as + * Matrix( _nRows, _nCols ). + * This does NOT work on an only declared Matrix such as: + * Matrix obj; + * obj << 5; //Error + * @return + */ + friend Matrix& operator <<( Matrix& leftM, float number ); - /** @brief - * Overloads the Minus, returns a new object - * @param rightM - * @return Returns an instance of the asnwer - */ - const Matrix operator -( const Matrix &rightM ); +/***********************************************************************/ - - /** @brief * Returns TRUE if the matrix is zero, FALSE otherwhise * @param mat: Matrix to be tested @@ -137,79 +241,50 @@ bool isVector(); - + /** @brief * Shatters the matrix into a single Row Vector. * Important: Returns NEW matrix, does no modify existing one. */ - Matrix ToPackedVector(); + static const Matrix ToPackedVector( const Matrix& Mat ); - + /** @brief * Determines if two matrices are equal. * @param mat1: First Matrix * @param mat2: Sencond Matrix */ - static bool Equals( const Matrix mat1, const Matrix mat2 ); - - - - /**@brief - * This Funcrions instanciates a new Row Matrix. Since this is a - * static function it needs to be assigned to an Empy Matrix Object - * @param Rows: Number of Rows - */ - static Matrix CreateRowMatrix(int Rows); - - - - /** @brief - * This function instanciates a new Column Matrix. Since this is a - * static function it needs to be assigned to an Empty Matrix object - * @param Cols: Number of Columns in Matrix - */ - static Matrix CreateColumnMatrix(int Cols); + static bool Equals( const Matrix& mat1, const Matrix& mat2 ); /** @brief - * This STATIC function Clones two Matrices. - * The Source Matrix can be any Size. - * The Receip Matrix MUST be just initialized - * as in: Matrix NewMatrix(); - * @param Source: Base Matrix to Clone. - * @param Receip: Destination shell matrix - */ - static void Clone( const Matrix &Source, Matrix &Receip ); - - - /** @brief - * Invoking this static method will increase a Row in Mat in the desired + * Invoking this static method will increase a Row in Mat in the desired * position. * The current Row will be moved down to allocate space, and all elements will * be initialized to zero in the new row. - * @param Mat: Matrix in wich to insert a Row + * @param Mat: Matrix in wich to insert a Row * @param Row: Number of row to insert, starts with one, not zero. - */ - static void AddRow( Matrix &Mat, int Row ); + */ + static void AddRow( Matrix& Mat, int Row ); - + /** @brief - * Invoking this static method will increase a Column in Matrix in the + * Invoking this static method will increase a Column in Matrix in the * desired Position. * @param Mat: Matrix in wich to insert a Column * @param Col: Number of column, strats with one, not zero. */ - static void AddColumn( Matrix &Mat, int Col ); - + static void AddColumn( Matrix& Mat, int Col ); + /** @brief * Static Function Deletes Row from Matrix, Static to prevent missuse * @param Mat: Matrix to delete Row from * @param Row: Number of Row (first Row = 1) */ - static void DeleteRow( Matrix &Mat, int Row ); + static void DeleteRow( Matrix& Mat, int Row ); /** @brief @@ -219,7 +294,7 @@ * @param Col: Number of Col to delete (first Col = 1) * @param Mat: Matrix to delete from. */ - static void DeleteCol( Matrix &Mat, int Col ); + static void DeleteCol( Matrix& Mat, int Col ); @@ -228,28 +303,30 @@ * This method extracts a Row from a Matrix and Saves it in Mat. * If Row is out of the parameters it does nothing, but prints a warning. * @param Row: number of row to extract elements. this->_nRows. - * @param Mat: Matrix to resize if neccesaty and save data. + * @param Mat: Matrix to extract from. + * @return New Row Matrix. */ - void ExportRow( int Row, Matrix &Mat); - - - - - - - - /** @brief - * This method extracts a Column from a Matrix and saves it to Mat. - * If Row is out of the parameters, it does nothing and prints a warning. - * @param Col: number of Column to extract elements. this->_nCols. - * @param Mat: Matrix to save data to. - */ - void ExportCol( int Col, Matrix &Mat ); + static const Matrix ExportRow( const Matrix& Mat, int row ); /** @brief - * This function resizes the Matrix to fit new data. + * This method extracts a Column from a Matrix and returns the Column + * as a new Matrix. + * If Row is out of the parameters, it does nothing and prints a warning. + * @param Col: number of Column to extract elements. this->_nCols. + * @param Mat: Matrix to extract from. + * @return New Row Matrix. + */ + static const Matrix ExportCol( const Matrix& Mat, int col ); + + + + /** @brief + * This function resizes the Matrix to fit new data or cropped it, + * to use newly created memory use .add() not << operator. + * << operator overwites everithing + * * @param Rows: New Number of Rows * @param Cols: New numbler of columns */ @@ -261,23 +338,25 @@ * Asks user for numbers to fill the Matrix elements, one by one. * It uses printf(); by default the USBTX, USBRX, 9600, 1N8. */ - void FillMatrix(); + virtual void FillMatrix(); /** @brief - * Prints the entire Matrix + * Prints the entire Matrix using standard PRINTF */ - void print(); + virtual void print(); - + /** @brief * Makes all values on Matrix object zero. + * Also make posible use the '<<' operator to add elements and keep + * track of last element added. */ void Clear(); - + /** @brief * Assigns a float number to the matrix in a specified position * Index starts at [1][1]. @@ -305,16 +384,16 @@ float getNumber( int Row, int Col ); - + /**@brief - * Retuns the number of Columns in Matrix + * Retuns the number of Columns in Matrix, index starts at 1. */ int getCols(); /**@brief - *Retruns the number of Rows in Matrix + *Retruns the number of Rows in Matrix, index starts at 1. */ int getRows(); @@ -324,12 +403,23 @@ /** 2-D Vector Array*/ vector < vector<float> > _matrix; + + /** Number of Rows in Matrix*/ int _nRows; /**Number of Columns in Matrix*/ int _nCols; + + + /**Last Element Row position in Matrix*/ + int _pRow; + + /**Last Element Col position in Matrix*/ + int _pCol; + }; -#endif /* MATRIX_H */ +#endif /* MATRIX_H */ +