00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _MATRIXNXM_H_
00016 #define _MATRIXNXM_H_
00017
00018
00019
00020
00021
00022 template <class T>
00023 class MATRIZ_NxM
00024 {
00025 unsigned numrows, numcols;
00026 T *entries;
00027
00028 public:
00029
00030
00031 MATRIZ_NxM(unsigned numrows, unsigned numcols);
00032 ~MATRIZ_NxM();
00033
00034
00035 unsigned numRows(void);
00036 unsigned numCols(void);
00037
00038
00039 virtual MATRIZ_NxM<T> operator +(const MATRIZ_NxM<T> &op);
00040 virtual MATRIZ_NxM<T> operator -(const MATRIZ_NxM<T> &op);
00041 virtual MATRIZ_NxM<T> operator *(const MATRIZ_NxM<T> &op);
00042
00043
00044 void imprimir();
00045 };
00046
00047
00048
00049
00050
00051
00052
00056 template <class T>
00057 MATRIZ_NxM<T>::MATRIZ_NxM(unsigned n, unsigned m)
00058 : numrows(n), numcols(m)
00059 {
00060 assert(n > 0 && m > 0);
00061 entries = new T[n * m];
00062
00063 if(entries == NULL)
00064 throw new libRuntime::MemoryException();
00065 }
00066
00067
00071 template <class T>
00072 MATRIZ_NxM<T>::~MATRIZ_NxM()
00073 {
00074 if(entries != NULL)
00075 delete[] entries;
00076 }
00077
00078
00083 template <class T>
00084 unsigned MATRIZ_NxM<T>::numRows(void)
00085 {
00086 return numrows;
00087 }
00088
00089
00094 template <class T>
00095 unsigned MATRIZ_NxM<T>::numCols(void)
00096 {
00097 return numcols;
00098 }
00099
00100
00104 template <class T>
00105 MATRIZ_NxM<T> MATRIZ_NxM<T>::operator +(const MATRIZ_NxM<T> &op)
00106 {
00107 assert(numrows == op.numrows);
00108 assert(numcols == op.numcols);
00109
00110 MATRIZ_NxM<T> result(numrows, numcols);
00111
00112 for(unsigned i = 0; i < numcols * numrows; i++)
00113 result.entries[i] = entries[i] + op.entries[i];
00114
00115 return result;
00116 }
00117
00118
00122 template <class T>
00123 MATRIZ_NxM<T> MATRIZ_NxM<T>::operator -(const MATRIZ_NxM<T> &op)
00124 {
00125 assert(numrows == op.numrows);
00126 assert(numcols == op.numcols);
00127
00128 MATRIZ_NxM<T> result(numrows, numcols);
00129
00130 for(unsigned i = 0; i < numcols * numrows; i++)
00131 result.entries[i] = entries[i] - op.entries[i];
00132
00133 return result;
00134 }
00135
00136
00140 template <class T>
00141 MATRIZ_NxM<T> MATRIZ_NxM<T>::operator *(const MATRIZ_NxM<T> &op)
00142 {
00143 assert(numcols == op.numrows);
00144
00145 MATRIZ_NxM<T> result(numrows, op.numcols);
00146
00147 for(unsigned i = 0; i < numrows; i++)
00148 {
00149 for(unsigned j = 0; j < op.numcols; j++)
00150 {
00151
00152
00153
00154 T accum = 0;
00155
00156 for(unsigned k = 0; k < numcols; k++)
00157 accum += entries[i * numcols + k] * op.entries[k * op.numcols + j];
00158
00159 result.entries[i * result.numcols + j] = accum;
00160 }
00161 }
00162
00163 return result;
00164 }
00165
00166
00171 void
00172 MATRIZ_NxM::imprimir(void)
00173 {
00174 int fila, columna;
00175
00176 printf("=================================\n");
00177 for( fila = 0; fila < numrows; fila++ ) {
00178 for( columna = 0; columna < numcols; columna++ ) {
00179 printf("(%d,%d)=%.2f\t", fila, columna, entries[fila*numcols + columna]);
00180 }
00181 printf("\n");
00182 }
00183 printf("=================================\n");
00184 fflush(stdout);
00185 }
00186
00187 #endif
00188