Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

matriznm.h

Ir a la documentación de este archivo.
00001 /*
00002  * Universidad de los Andes
00003  * Departamento de sistemas y computación
00004  * http://ella.uniandes.edu.co
00005  *
00006  * ---------------------------------------------------------------
00007  * Ver documento README en la base de la distribución de libMath.
00008  * Historia de este archivo disponible en el log de CVS.
00009  * ---------------------------------------------------------------
00010  * 
00011  * Autores:
00012  * Sebastián González (se-gonza@uniandes.edu.co)
00013  */
00014 
00015 #ifndef _MATRIXNXM_H_
00016 #define _MATRIXNXM_H_
00017 
00018 // OJO: Esta vaina que?
00019 //#include <cassert>
00020 //#include "MemoryException.h"
00021 
00022 template <class T>
00023 class MATRIZ_NxM
00024 {
00025         unsigned numrows, numcols;
00026         T *entries;
00027 
00028 public:
00029 
00030         // constructoras / destructoras
00031         MATRIZ_NxM(unsigned numrows, unsigned numcols);
00032         ~MATRIZ_NxM();
00033 
00034         // analizadoras
00035         unsigned numRows(void);
00036         unsigned numCols(void);
00037 
00038         // operadores
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         // depuradoras
00044         void imprimir();
00045 };
00046 
00047 
00048 /******************
00049   Implementaciones
00050  ******************/
00051 
00052 
00056 template <class T>
00057 MATRIZ_NxM<T>::MATRIZ_NxM(unsigned n, unsigned m)
00058 : numrows(n), numcols(m)                // efficient!
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                         // para cada entrada del resultado...
00152                         // R[i, j] = suma( A[i,k] * B[k, j] )
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 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.