Niet af

Fork of Matrix by Ernesto Palacios

Matrix.cpp

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

File content as of revision 0:3abd8c2d7c34:

#include "mbed.h"
#include "Matrix.h"

// Rows by Cols Matrix Constructor
Matrix::Matrix(int Cols, int Rows): _Cols(Cols), _Rows(Rows)
{
    _matrix.resize(_Rows);
    for( int i = 0; i < _Rows; i++ )
        _matrix[i].resize(_Cols);
}



// Defines the same parameters as 'base' Matrix
Matrix::Matrix(const Matrix &base): _Cols(base._Cols), _Rows(base._Rows)
{
    _matrix.resize(_Rows);
    for( int i = 0; i < _Rows; i++ )
        _matrix[i].resize(_Cols);
}



// Square Matrix Constructor
Matrix::Matrix(int square): _Cols(square), _Rows(square)
{
    _matrix.resize(_Rows);
    for( int i = 0; i < _Rows; i++ )
        _matrix[i].resize(_Cols);
}



// Default Constructor
Matrix::Matrix(){/*Intentionally left Blank*/}


//*****  OPERATORS ****//

// Overloaded Asign Operator
Matrix& Matrix::operator = ( const Matrix &rightM )
{
    if( *this != rightM )
    {
        this->_Rows = rightM._Rows;
        this->_Cols = rightM._Cols;

        this->_matrix.resize( rightM._Rows );
        for( int i = 0; i < rightM._Rows; i++ )
            this->_matrix [i].resize(rightM._Cols);

        for( int i = 0; i < _Rows; i++ )
            for( int j = 0; j < _Cols; j++ )
                this->_matrix[i][j] = rightM._matrix[i][j];

        return *this;
    }
    else
    {
        Matrix ret (*this);
        return ret;
    }
}


bool Matrix::operator == ( const Matrix& rightM )
{
    if( _Rows == rightM._Rows  &&  _Cols == rightM._Cols )
    {
        bool equal = false;

        for( int i = 0; i < _Rows; i++ )
            for( int j = 0; j < _Cols; j++ )
                if( _matrix[i][j] != rightM._matrix[i][j] )
                    equal = equal || true;

        return !equal;

    }else{  return false;  }
}


bool Matrix::operator != ( const Matrix &rightM )
{
    return !( *this == rightM );
}


Matrix& Matrix::operator +=(const Matrix& rightM)
{
    if( _Rows == rightM._Rows  &&  _Cols == rightM._Cols )
    {
        for( int i = 0; i < _Rows; i++ )
            for( int j = 0; j < _Cols; j++ )
                _matrix[i][j] += rightM._matrix[i][j];

        return *this;

    }else{
        
        printf( "\nERROR\nDiferent Dimensions @ += Assignment\n" );
        
        //  Code below doesn't work!  I dunno why. But anyway at this point
        //  the program should break anyway.
        //
        //Matrix::Matrix error( 4 );
        //error.Clear();
        //return error;
     
    }
}


Matrix& Matrix::operator -=(const Matrix& rightM)
{
    if( _Rows == rightM._Rows  &&  _Cols == rightM._Cols )
    {
        for( int i = 0; i < _Rows; i++ )
            for( int j = 0; j < _Cols; j++ )
                _matrix[i][j] -= rightM._matrix[i][j];

        return *this;

    }else{
        printf( "\nERROR\nDiferent Dimensions @ -= Assignment\n" );
        
       // return rightM;
    }
}

const Matrix Matrix::operator +(const Matrix& rightM)
{
    Matrix result = *this;
    result += rightM;
    return result;
}

const Matrix Matrix::operator -(const Matrix& rightM)
{
    Matrix result = *this;
    result -= rightM;
    return result;
}

//------------------------------------------

//*** Method that return MATRIX objects ***//



Matrix Matrix::GetRow(Matrix mat, int Row)
{
    if( Row > mat._Rows )
    {
        printf( "WARNING: Row out of dimmensions @ GetRow().\nEmpty Matrix Returned\n" );
        Matrix err( 1 , mat._Cols );
        err.Clear();
        return err;
    }else{

        Matrix SingleRow( 1 , mat._Cols );

        for( int i = 0; i < mat._Cols; i++ )
            SingleRow._matrix[0][i] = mat._matrix[Row][i];

        return SingleRow;
    }
}



Matrix Matrix::GetCol(Matrix mat, int Col)
{
    if( Col > mat._Cols )
    {
        printf( "WARNING: Column out of dimmensions @ GetCol.\nEmpty matrix returned\n" );
        Matrix err( mat._Rows , 1 );
        err.Clear();
        return err;
    }else{

        Matrix SingleCol( mat._Rows, 1 );
        for(int i = 0; i < mat._Rows; i++ )
            SingleCol._matrix[i][0] = mat._matrix[i][Col];
        return SingleCol;
    }
}



Matrix Matrix::ToPackedVector()
{
    Matrix Shattered( ( this->_Rows * this->_Cols ) , 1 );

    int cont = 0;
    for( int i = 0; i < this->_Rows; i++ )
    {
        for( int j = 0; j < this->_Cols; j++ )
        {
            Shattered._matrix[0][cont] = this->_matrix[i][j];
            cont++;
        }
    }

    return Shattered;
}
//----------------------------------------------------

//*** Method returning BOOLEAN ***//




bool Matrix::isZero()
{
    bool zero = false;
    for( int i = 0; i < this->_Rows; i++ )
        for( int j = 0; j < this->_Cols; j++ )
            if( this->_matrix[i][j] != 0 )
                zero = zero || true;
    return !zero;
}



bool Matrix::isVector()
{
    if( this->_Rows == 1 || this->_Cols == 1 )
        return true;
    else
        return false;
}

//-------------------------------------

//*** Static Methods ***//

const bool Matrix::Equals( Matrix mat1, Matrix mat2 )
{
    if( mat1._Cols == mat2._Cols  &&  mat1._Rows == mat2._Rows )
    {
        bool equal = false;

        for( int i = 0; i < mat1._Rows; i++ )
            for( int j = 0; j < mat1._Cols; j++ )
                if( mat1._matrix[i][j] != mat2._matrix[i][j] )
                    equal = equal || true;

        return !equal;

    }else{
        printf( "ERROR: Diferent Size Matrices!\n" );
        printf( "mat1._Rows = %u\nmat1._Cols = %u\n",mat1._Rows, mat1._Cols );
        printf( "mat2._Rows = %u\nmat2._Cols = %u\n",mat2._Rows, mat2._Cols );;
        return false;
    }
}



Matrix Matrix::CreateColumnMatrix(int Cols)
{
    Matrix ColMatrix(1,Cols);
    return ColMatrix;
}



Matrix Matrix::CreateRowMatrix(int Rows)
{
    Matrix RowMatrix( Rows, 1);
    return RowMatrix;
}



void Matrix::Clone( const Matrix &Source, Matrix Receip )
{
    Receip._Cols = Source._Cols;
    Receip._Rows = Source._Rows;

    Receip._matrix.resize(Receip._Rows);
    for( int i = 0; i < Receip._Rows; i++ )
        Receip._matrix[i].resize(Receip._Cols);

    for( int i = 0; i < Receip._Rows; i++ )
       for( int j = 0; j < Receip._Cols; j++ )
           Receip._matrix[i][j] = Source._matrix[i][j];
}


void Matrix::DeleteRow(Matrix& Mat, int Row)
{
    --Row;

    if( Row > Mat._Rows )
    {
        printf("\nERROR:\nColumn out of Limits on DeleteCol()\n");
        
    }else{

        for( int i = Row; i < Mat._Rows - 1; i++ )
        
            for( int j = 0; j < Mat._Cols; j++ )
                Mat._matrix[i][j] = Mat._matrix[i+1][j];
        Mat._Rows--;
        Mat._matrix.resize(Mat._Rows);
    }
}



void Matrix::DeleteCol( Matrix &Mat, int Col)
{
    --Col; // Because of Column zero.

    if( Col > Mat._Cols )
    {
        printf("\nERROR:\nColumn out of Limits on DeleteCol()\n");
        
    }else{

        for( int i = 0; i < Mat._Rows; i++ )
            for( int j = Col; j < Mat._Cols; j++ )
                Mat._matrix[i][j] = Mat._matrix[i][j+1];

        // Decrease one column
        Mat._Cols--;

        //Erase last Column
        for( int i = 0; i < Mat._Rows; i++ )
            Mat._matrix[i].reserve(Mat._Cols);

    }
}

//---------------------------------------------------------------

//***  Methods returning nothing VOID ***//

void Matrix::Add(int Row, int Col, float number)
{
    if( Row > _Rows || Col > _Cols )
    {
        printf("\nERROR:\n@ Matrix::Add, Out of limits of Matrix\n");

    }else{
        _matrix[Row][Col] = number;
    }


}

void Matrix::Resize( int Rows, int Cols )
{
    this->_Rows = Rows;
    this->_Cols = Cols;
    this->_matrix.resize( _Rows );
    
    for( int i = 0; i< _Rows ; i++ )
        _matrix[i].resize(_Cols);
}


void Matrix::FillMatrix()
{
    for(int i = 0; i < _Rows; i++)
    {
        for(int j = 0; j < _Cols; j++)
        {
            printf( "Position [%u][%u]: ", i, j );
            float numero;
            scanf( "%f", &numero );
            printf("%.3f ", numero);
            this->Add( i, j, numero);
        }
        printf("\n");
    }
    printf("\n");
}


void Matrix::Clear()
{
    for( int i = 0; i < _Rows; i++ )
       for( int j = 0; j < _Cols; j++ )
           _matrix[i][j] = 0;
 }

void Matrix::print()
{
    for( int i = 0; i < _Rows; i++ )
    {
        for( int j = 0; j < _Cols; j++ )
        {
            printf( "%.3f, ",_matrix[i][j] );
        }
        printf( "\n" ); 
    }
}



float Matrix::Sum()
{
    float total;

    for( int i = 0; i < this->_Rows; i++ )
        for( int j = 0; j < this->_Cols; j++ )
            total += this->_matrix[i][j];
    return total;
}



float Matrix::GetNumber( int Row, int Col )
{
    return this->_matrix[Row][Col];
}


int Matrix::getRows(){ return this->_Rows; }

int Matrix::getCols(){ return this->_Cols; }