Matrix Library. v1.6.4

Dependents:   Matrix_class Wizardsneverdie TwoTank mbed_multiplex_matrix ... more

Matrix.h

Committer:
Yo_Robot
Date:
2011-09-26
Revision:
1:48f417da268e
Parent:
0:3abd8c2d7c34
Child:
2:493402568a5e

File content as of revision 1:48f417da268e:


/** 
 * @file:   Matrix.h
 * @author: Ernesto Palacios
 * Created on 13 de septiembre de 2011, 03:49 PM
 * 
 * Develop Under  GPL v3.0 License
 * http://www.gnu.org/licenses/gpl-3.0.html
 *
 */

#ifndef MATRIX_H
#define MATRIX_H

#include <vector>

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.
 * 
 * myMatrix.Fill();        // Fill the matrix using printf() and scanf().
 * myMatrix.print();       // Prints the value of the Matrix. printf()
 * 
 * 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
 *
 */
class Matrix{
public:

    /// 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 );


    /// 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 );


    
    /** @brief
     * Overload opeartor for the compare Matrices
     *
     * @param rightM
     * @return Boolean 'false' if different.
     */
    bool operator == ( const Matrix &rightM );



    /** @brief
     * Overload opeartor for the compare Matrices
     *
     * @param rightM
     * @return Boolean 'true' if different
     */
    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 );



    /** @brief
     * Overload Compund decrease.
     * @param rightM Right hand matrix
     * @return A new Matrix to be assigned to itself
     */
    Matrix& operator -= ( const Matrix &rightM );



    /** @brief
     * Overloads the Plus, returns a new object.
     * @param rightM right side Matrix
     * @return Retuns an instance of the answer.
     */
    const Matrix operator +( const Matrix &rightM );

    

    /** @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
     */
    bool isZero();



    /** @brief
     * Determines weather a Matrix is a Single Column or Row.
     */
    bool isVector();


 
    /** @brief
     * Shatters the matrix into a single Row Vector.
     * Important: Returns NEW matrix, does no modify existing one.
     */
    Matrix ToPackedVector();


     
    /** @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);



    /** @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 
     * 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 Row: Number of row to insert, starts with one, not zero.
     */   
    static void AddRow( Matrix &Mat, int Row );

    
    /** @brief
     * 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 );
    

    /** @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 );


    /** @brief
     * Static Function Deletes Column from Matrix, it's Static to prevent
     * missuse.
     * Print error and does nothing if out of limits.
     * @param Col: Number of Col to delete (first Col = 1)
     * @param Mat: Matrix to delete from.
     */
    static void DeleteCol( Matrix &Mat, int Col );




     /** @brief
     * 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.
     */
     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 );



    /** @brief
     * This function resizes the Matrix to fit new data.
     * @param Rows: New Number of Rows
     * @param Cols: New numbler of columns
     */
    void Resize( int Rows, int Cols );



    /** @brief
     * Asks user for numbers to fill the Matrix elements, one by one.
     * It uses printf(); by default the USBTX, USBRX, 9600, 1N8.
     */
    void FillMatrix();



    /** @brief
     * Prints the entire Matrix
     */
    void print();


    
    /** @brief
     * Makes all values on Matrix object zero.
     */
    void Clear();

    
    /** @brief
     * Assigns a float number to the matrix in a specified position
     * Index starts at [1][1].
     *
     * @param number:   Number to be set
     * @param Row:      Row of Matrix
     * @param Col:      Column of Matrix
     */
    void add( int Row, int Col, float number );



    /** @brief
     * Returns the sum of every cell in the Matrix.
     */
    float sum();


    /** @brief
     * Return the number in position [Row],[Col]
     * @param Row = number of row in matrix
     * @param Col = number of Col in matrix
     * @return Num = float number in matrix
     */
    float getNumber( int Row, int Col );


    
    /**@brief
     * Retuns the number of Columns in Matrix
     */
    int  getCols();



    /**@brief
     *Retruns the number of Rows in Matrix 
     */
    int  getRows();


private:

    /** 2-D Vector Array*/
    vector < vector<float> > _matrix;

    /** Number of Rows in Matrix*/
    int _nRows;

    /**Number of Columns in Matrix*/
    int _nCols;

};

#endif    /* MATRIX_H */