Código: Seleccionar todo
g++ matriz.c++ -o matriz
Código: Seleccionar todo
./matriz
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.
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
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 --
Bueno, ya lo implementé aquí: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...
Resolución de sistemas lineales: Clase Matriz
Fue mucho más rápido que con el método de Gauss-Jordan.
Saludos