#ifndef _Matrix_H_
#define _Matrix_H_
#include <cassert>
#include <cstdlib>
using namespace std;
namespace storage{
template<class Type>
class Matriz
{
public:
/* constructor vacio
*/
inline Matriz();
/* constructor copia
*/
inline Matriz(const Matriz &M);
/* constructor parametrizado
*/
inline Matriz(unsigned int nRows, unsigned int nCols);
/* redimensionar la matriz
*/
inline void resize(unsigned int nRows, unsigned int nCols);
/* indica el numero de filas
*/
unsigned int getNRows() { return _nRows;}
/* indica el numero de columnas
*/
unsigned int getNCols() { return _nCols;}
/* retorna el valor indicado por las variables
*/
inline Type & get(unsigned int r,unsigned int c);
/* hace que la matriz sea la indentidad
*/
inline void setIdentity();
/* operador de asignacion
*/
inline Matriz & operator=(const Matriz &M);
/* realiza la suma de dos matrices
*/
inline Matriz & operator+(const Matriz &M);
/* destructor
*/
inline ~Matriz();
private:
Type **_data;
unsigned int _nRows;
unsigned int _nCols;
};
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type>::Matriz()
{
_data=NULL;
_nRows=0;
_nCols=0;
}
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type>::Matriz(const Matriz &M)
{
int i,j;
_nRows=M._nRows;
_nCols=M._nCols;
_data= new Type*[_nRows];
for(i=0;i<_nRows;i++){
_data[i]=new Type[_nCols];
}
for(i=0;i<_nRows;i++){
for(j=0;j<_nCols;j++){
_data[i][j]=M._data[i][j];
}
}
}
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type>::Matriz(unsigned int nRows, unsigned int nCols)
{
int i;
_nRows=nRows;
_nCols=nCols;
if(_data==NULL){
_data= new Type*[_nRows];
for(i=0;i<_nRows;i++){
_data[i]=new Type[_nCols];
}
}
}
//////////////////////////
//
//////////////////////////
template<class Type>
void Matriz<Type>::resize(unsigned int nRows, unsigned int nCols)
{
int i;
if(_data!=NULL){
for(i=0;i<nRows;i++){
delete []_data[i];
}
delete []_data;
}
Matriz(nRows, nCols);
}
//////////////////////////
//
//////////////////////////
template<class Type>
Type & Matriz<Type>::get(unsigned int r, unsigned int c)
{
return _data[r][c];
}
//////////////////////////
//
//////////////////////////
template<class Type>
void Matriz<Type>::setIdentity()
{
int i,j;
for(i=0;i<_nRows;i++){
for(j=0;j<_nCols;j++){
if(i==j)
_data[i][j]=1;
else
_data[i][j]=0;
}
}
}
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type> & Matriz<Type>::operator=(const Matriz &M)
{
int i,j;
if(_data==NULL)
Matriz(M._nRows, M._nCols);
for(i=0;i<_nRows;i++){
for(j=0;j<_nCols;j++){
_data[i][j]=M._data[i][j];
}
}
return *this;
}
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type> & Matriz<Type>::operator+(const Matriz &M)
{
int i,j;
if(_data==NULL)
Matriz(M._nRows, M._nCols);
for(i=0;i<_nRows;i++){
for(j=0;j<_nCols;j++){
_data[i][j]=_data[i][j]+M._data[i][j];
}
}
return *this;
}
//////////////////////////
//
//////////////////////////
template<class Type>
Matriz<Type>::~Matriz()
{
int i;
if(_data!=NULL){
for(i=0;i<_nRows;i++){
delete []_data[i];
}
delete []_data;
}
}
};
#endif