Matrix Library. v1.6.4 + some changes

Revision:
2:493402568a5e
Parent:
1:48f417da268e
Child:
3:589fb80932b5
diff -r 48f417da268e -r 493402568a5e Matrix.h
--- 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 */
+