use from Ernesto Palacios
Dependents: RoboticArm DXL_SDK_Porting_Test
Fork of Matrix by
Diff: Matrix.cpp
- Revision:
- 0:3abd8c2d7c34
- Child:
- 1:48f417da268e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Matrix.cpp Fri Sep 23 21:12:17 2011 +0000 @@ -0,0 +1,427 @@ +#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; } + + +