Clase Matriz incipiente: C++

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )
Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 404
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Clase Matriz incipiente: C++

Mensaje por cerenkov »

Bueno, trato de crear una clase Matriz muy sencilla para que se vea como es la implementación. Faltan muchas cosas como el constructor y destructor de la clase y, prácticamente, casi todas las funciones (sólo lo hice con la suma) que se pueden implementar con matrices pero este es el comienzo. El programa fuente lo compilé con:

Código: Seleccionar todo

g++ matriz.c++ -o matriz
y se ejecuta con:

Código: Seleccionar todo

./matriz
Aquí les dejo el *.zip con el *.c++, el *.h y el ejecutable.

Saludos

Editado -- Dom Jul 11, 2010 5:21 pm --

Bueno, ampliamos la clase ( MATRIZ0.1.zip). Ahora tiene más funciones; incluso se sobrecarga los operadores << y >> para la entrada y salida (también tiene resta, multiplicación de matrices, escalares x matrices; entre otros). También se incluye el constructor (ahora, cuando se inicializa una matriz esta lo hace con ceros en todos sus elementos; no con "basura") y destructor de la clase. Trataremos, en el futuro, de seguir generalizando.

Saludos

Editado -- Vie Jul 16, 2010 9:43 pm --

Estuve un buen tiempo tratando de implementar la inversa de una matriz dentro de la Clase hasta que, por fin, lo logré. Como es una sola función adicional la incluyo después; así como la generalización.

Saludos

Editado -- Vie Jul 23, 2010 9:24 am --

Bueno, no tengo por ahora mucho tiempo para dedicarle a esto pero como el tema lo publicaron en la portada hice un alto para añadir el cálculo de la inversa. El programa principal inicializa una matriz (a), calcula su inversa (b) y verifica que su producto (a*b) es la matriz identidad (c = a*b). Imprime cada matriz simplemente con la instrucción cout (el operador << está sobrecargado para ello). La clase se puede generalizar para matrices NxN (o MxN pero aquí habría que hacer una prueba de conformidad para multiplicación de matrices, etc) por lo que el orden habria que pasárselo como parámetro al interior de las funciones. Por qué no lo hice así al principio? Porque es más fácil depurar el código con matrices cuadradas pequeñas. La generalización debería ser más fácil (eso creo).

Saludos

Editado -- Dom Jul 25, 2010 12:58 am --

Gracias a nicky, descubrí esta funcionalidad de pastebin. Por ello, publico un link a código syntax higlithing:

matriz.c++

del programa principal. Fíjense que una vez declarados los objetos de la clase Matriz (a, b, c, el que quieran) y definidos sus procedimientos (asumimos que están bien pero sabemos que hay que mejorarlos), la multiplicación es tan natural como la de los tipos enteros o double. Para calcular el producto de a*b simplemente coloco c = a*b (sabemos que hay un algoritmo para ello pero está encapsulado en un procedimiento donde sobrecargamos el operador * de multiplicación). Para determinar la inversa usamos una función miembro de la clase (invermat(double **a)) y se la asignamos al objeto b: b.invermat(w). Después del c = a*b, simplemente desplegamos la matriz identidad con un cout << c.

Saludos

Editado -- Jue Jul 29, 2010 9:58 am --

Después de algún tiempo, he podido restituir las entradas a mi blog que contiene codigo C++ (la mayoría de ellos para Linux aunque el código es fácilmente portable, con muy ligeras modificaciones, porque se ajusta a los estándares) para resolver varios problemas de análisis numérico:

Codigo C++

Si tienen algún problema en la implementación de alguno de ellos agradecería que me lo comunicaran ya que fueron restituidas por copy/paste y detecté alguno que otro error.

Nota: Retiré el primer *.zip (MATRIZ0.1.zip) porque ya no tiene sentido mantenerlo. Dejaré siempre los dos últimos.

Saludos

Editado -- Jue Ago 26, 2010 7:12 pm --

Después de un tiempo dedicado a otras cosas, le puse un poco de empeño a esta Clase Matriz. Como bien sabemos, las matrices tienen filas y columnas que pueden ser diferentes. La antigua Clase Matriz sólo trataba con matrices cuadradas 3 x 3. Ahora si está generalizada (eso creo) a matrices MxN debido a que ahora si existe posibilidad de pasarle como parámetros el número de filas y colunnas de la matriz gracias a que se mejoró el constructor de la Clase. Eso también permite que los métodos y procedimientos expresados a través de las funciones miembro y amigas de la Clase puedan acceder a estos valores que antes se asumían de manera arbitraria en 3. Para probarlo, definí tres objetos para la multiplicación de matrices, mediante la sobrecarga del operador *, donde se incluye ahora un assert para verificar que las matrices son conformes, es decir, el número de columas de la primera matriz debe ser igual al número de filas de la segunda matriz para que la multiplicación tenga sentido. No incluí los procedimientos para la suma, resta, etc pero ya están en Matriz0.2 y sólo hay que generalizarlas adecuadamente (me imagino que el assert debe vericar ahora , por ejemplo para la suma, que ambas matrices sean iguales).

A continuación, incluyo la salida del programa y el adjunto Matriz0.3.zip.

Código: Seleccionar todo

Objeto a; Matriz a(3,3)
   1.00000   2.00000   3.00000
   2.00000   1.00000   4.00000
   3.00000   4.00000   1.00000

Objeto b; Matriz b(3,2)
   1.00000   2.00000
   2.00000   1.00000
   3.00000   4.00000

Objeto c(3,2) = a(3,3) * b(3,2)
  14.00000  16.00000
  16.00000  21.00000
  14.00000  14.00000
El resultado fue verificado con calc de Openoffice.org.

matriz.c++

Matriz.h

Saludos

Nota: Matriz0.3.zip tenía un pequeño error (un 2 adicional en el nombre de la cabecera de la Clase del programa principal que impediría su compilación). Ya fue corregido. Mis disculpas a los 9 que ya lo habían bajado.

Editado -- Vie Ago 27, 2010 6:33 pm --

Ya incluí una nueva versión que añade, entre otras, suma, resta y multiplicación de escalares con matrices y la inversión de matrices cuadradas. Ahora si puedo resolver sistemas lineales como pensé una vez sin necesidad de usar el método de Gauss-Jordan. Sólo sería posible de manera expedita mediante la implementación de una Clase Matriz.

Saludos

Editado -- Vie Ago 27, 2010 9:34 pm --
cerenkov escribió:...Editado -- Vie Ago 27, 2010 6:33 pm --

... Ahora si puedo resolver sistemas lineales como pensé una vez sin necesidad de usar el método de Gauss-Jordan. Sólo sería posible de manera expedita mediante la implementación de una Clase Matriz...
Bueno, ya lo implementé aquí:

Resolución de sistemas lineales: Clase Matriz

Fue mucho más rápido que con el método de Gauss-Jordan.

Saludos
Adjuntos
MATRIZ0.4.zip
(8.26 KiB) Descargado 750 veces
MATRIZ0.3.zip
(6.11 KiB) Descargado 553 veces
MATRIZ0.2.zip
(7.77 KiB) Descargado 334 veces

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje