Niet af

Fork of Matrix by Ernesto Palacios

Matrix.h

Committer:
Yo_Robot
Date:
2011-09-23
Revision:
0:3abd8c2d7c34
Child:
1:48f417da268e

File content as of revision 0:3abd8c2d7c34:


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

#include <vector>

#ifndef MATRIX_H
#define MATRIX_H

/**
 * @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
 * 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 [ Roxs 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 Description:
     * This is the '=' Overloaded operator. It RESIZES assigned the matrix.
     * Overwrites all data. To be used Carefully!
     */
    Matrix& operator = ( const Matrix &rightM );


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



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

    /**@brief
     * Description:
     * Overload Copmpound assignment.
     * @param rightM
     * @return A new Matrix to be assigned to itself.
     */
    Matrix& operator += ( const Matrix &rightM );



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



    /**@brief
     * Description:
     * 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
     * Description:
     * Overloads the Minus, returns a new object
     * @param rightM
     * @return Returns an instance of the asnwer
     */
    const Matrix operator -( const Matrix &rightM );



    /** @brief
     * Description:
     * This method extracts a Row from a Matrix.
     * If Row is out of the parameters, it returns
     * an empty Row and prints a warning
     * @param Matrix: Matrix to extract from
     * @param Row: row number of the matrix
     */
    Matrix GetRow(Matrix mat, int Row);



    /** @brief
     * Description:
     * This method extracts a Column from a Matrix.
     * If Row is out of the parameters, it returns
     * an empty Column and prints a warning
     */
    Matrix GetCol(Matrix mat, int Col);



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



    /** @brief
     * Description:
     * Returns TRUE if the matrix is zero, FALSE otherwhise
     * @param mat: Matrix to be tested
     */
    bool isZero();



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



    /**@brief
     * Description:
     * Determines if two matrices are equal.
     * @param mat1: First Matrix
     * @param mat2: Sencond Matrix
     */
    static const bool Equals( Matrix mat1, Matrix mat2 );



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



    /**@brief
     * Description:
     * Assigns a float number to the matrix in position
     *
     * @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
     * Description:
     * 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
     * Description:
     * Asks user for numbers to fill the Matrix elements. One by one
     */
    void FillMatrix();



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



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



    /** \brief
     * Description:
     * Returns the sum of every cell in the Matrix.
     */
    float Sum();


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


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



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


private:

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

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

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

};

#endif    /* MATRIX_H */