MULTIPLICACION DE MATRICES

MULTIPLICACION DE MATRICES

Dos matrices A y B son multiplicables si el número de columnas de A coincide con el número de filas de B.
Mm x n x Mn x p = M m x p 

El elemento cij de la matriz producto se obtiene multiplicando cada elemento de la fila i de la matriz A por cada elemento de la columna j de la matriz B y sumándolos

CODIGO EN C# PARA MULTIPLICAR MATRICES

using System ;
using System.Collections.Generic ;
using System. Text ;
namespace MultiplicacionMatrices {
    class MultiplicacionMatrices {
        static void Main ( ) {
            Console. WriteLine ( "[Matriz 1]" ) ;
            Console. Write ( "Filas: " ) ;
            int f1 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. Write ( "Columnas: " ) ;
            int c1 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. WriteLine ( " \n [Matriz 2]" ) ;
            Console. Write ( "Filas: " ) ;
            int f2 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. Write ( "Columnas: " ) ;
            int c2 = int . Parse ( Console. ReadLine ( ) ) ;
            int [ , ] Matriz1 = new int [ f1 + 1 , c1 + 1 ] ;
            int [ , ] Matriz2 = new int [ f2 + 1 , c2 + 1 ] ;
            int [ , ] Multiplicacion = new int [ f1 + 1 , c2 + 1 ] ;
            if ( c1 == f2 ) { Console. WriteLine ( " \n Datos [Matriz 1]: " ) ;
                for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c1 ; j ++ ) {
                        Console. Write ( "Ingresa Dato (Fila: {0} - Columna: {1}): " , i, j ) ;
                        Matriz1 [ i, j ] = int . Parse ( Console. ReadLine ( ) ) ; } }
                Console. WriteLine ( "Datos [Matriz 2]: " ) ;
                for ( int i = 1 ; i <= f2 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Console. Write ( "Ingresa Dato (Fila: {0} - Columna: {1}): " , i, j ) ;
                        Matriz2 [ i, j ] = int . Parse ( Console. ReadLine ( ) ) ;
                    } }
                for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Multiplicacion [ i, j ] = 0 ;
                        for ( int z = 1 ; z <= c1 ; z ++ ) {
                            Multiplicacion [ i, j ] = Matriz1 [ i, z ] * Matriz2 [ z, j ] + Multiplicacion [ i, j ] ;
                        } } }
                Console. WriteLine ( "Multiplicacion de 2 Matrices" ) ;
                for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Console. Write ( "{0} " , Multiplicacion [ i, j ] ) ;
                    }
                    Console. WriteLine ( ) ;
                } } else { Console. WriteLine ( "Error: No se puede multiplicar las matrices" + " Columnas: {0}! = Filas: {1}" , c1, f2 ) ;
            }
            Console. Read ( ) ;
        } } }

Explicación del Funcionamiento del Código:


Paso 1: El programa pide los datos de la matriz numero 1 y despues los datos de la matriz 2 ( entiendase por datos # filas y de columnas que conforman las matrices)
            Console. WriteLine ( "[Matriz 1]" ) ;             Console. Write ( "Filas: " ) ;
            int f1 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. Write ( "Columnas: " ) ;
            int c1 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. WriteLine ( " \n [Matriz 2]" ) ;
            Console. Write ( "Filas: " ) ;
            int f2 = int . Parse ( Console. ReadLine ( ) ) ;
            Console. Write ( "Columnas: " ) ;
            int c2 = int . Parse ( Console. ReadLine ( ) ) ;

Paso 2: Cada dato ha sido almacenado en una variable obteniendo asi cuatro variables que serian:

f1= Numero de filas de la matriz 1
c1= Numero de colunmas de la matriz 1
f2= Numero de filas de la matriz 2
c2= Numero de columnas de la matriz2

Paso 3: Luego de haber obtenido el numero de filas y de columnas de las matrices que se van a multiplicar se declaran las matrices y se asignan como # de filas y # de columnas las variables almacenadas anteriormente y se agrega +1 por que mas adelante las matrices se llenaran desde la posicion 1 y no desde la 0 como se lo hace comunmente.
 Nota: Se declaran las matrices despues de haber obtenido el numero de filas y de columnas de cada matriz por que si se lo hace antes el codigo generara error ya que se estaria usando variables aun no declaradas.

  int [ , ] Matriz1 = new int [ f1 + 1 , c1 + 1 ] ;
  int [ , ] Matriz2 = new int [ f2 + 1 , c2 + 1 ] ; 
  int [ , ] Multiplicacion = new int [ f1 + 1 , c2 + 1 ] ;
 
Paso 4: Luego de esto se evalua una condicion que seria: si el numero de colunmas de la matriz 1 (c1) es igual al numero de filas de la matriz 2 (f2) se ejecutan las sentencias dentro del "if".

if ( c1 == f2 )

Paso 5: Luego de haberse cumplido la condicion el programa muestra un mensaje pidiendo cada elemento  que conformaran cada matriz y los almacena usando la tecnica de fors anidados esta tecnica funciona de la siguiente manera: el primer for en ejecutarse es el mas interno que en este caso sera el de las colunmas luego de terminar este pasa al de las fila.

Ej: Usando for anidados si tuvieramos una matriz de 3x3 como la siguiente esta seria llenada comenzando desde la posicion 1,1 hasta la 1,3 esto seria controlado por el primer for luego de terminar este for se pasaria al de las filas y comenzaria de nuevo el proceso del for interno de las columnas  y se llenaria la segunda fila desde la posicion 2,1 al 2,3 y luego se llenaria la ultima fila de la misma forma.

Console. WriteLine ( " \n Datos [Matriz 1]: " ) ;
                for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c1 ; j ++ ) {
                        Console. Write ( "Ingresa Dato (Fila: {0} - Columna: {1}): " , i, j ) ;
                        Matriz1 [ i, j ] = int . Parse ( Console. ReadLine ( ) ) ; } }

                Console. WriteLine ( "Datos [Matriz 2]: " ) ;
                for ( int i = 1 ; i <= f2 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Console. Write ( "Ingresa Dato (Fila: {0} - Columna: {1}): " , i, j ) ;
                        Matriz2 [ i, j ] = int . Parse ( Console. ReadLine ( ) ) ;
                    } }

Paso 6: Este paso seria el mas importante de todo el programa ya que en este se realizaria todo el proceso matematico que conlleva la multiplicacion de matrices lo primero que observamos es que se han usado tres fors anidados esto nos dice que el programa va a necesitar tres movimientos diferentes.

                      
Explicacion por pasos de los tres for anidados

a)Al iniciar por primera vez el bucle de los tres fors los indices i,j,z comienzan en su valor inicial osea 1.

Multiplicacion [ i, j ] = Matriz1 [ i, z ] * Matriz2 [ z, j ] + Multiplicacion [ i, j ] ya reemplazando esto quedaria asi:
Multiplicacion [ 1, 1 ] = Matriz1 [ 1, 1 ] * Matriz2 [ 1, 1 ] + Multiplicacion [ 1, 1 ]

Luego reemplazando esas coordenadas por los datos de las matrices a multiplicar quedaria asi:

Multiplicacion [ 1, 1 ]=4*5+0
Multiplicacion [ 1, 1 ] =20
Nota: Multiplicacion [ i, j ] es igual a 0 por que  antes de entrar al for que contiene el proceso se declaro en ese valor.

 b) Luego de esto se ejecuta el for de z osea el for mas interno y se incrementa la z en 1 osea que ya valdria 2 y se realiza de nuevo la operacion.

Multiplicacion [ i, j ] = Matriz1 [ i, z ] * Matriz2 [ z, j ] + Multiplicacion [ i, j ] ya reemplazando esto quedaria asi:
Multiplicacion [ 1, 1 ] = Matriz1 [ 1, 2 ] * Matriz2 [ 2, 1 ] + Multiplicacion [ 1, 1 ]

Luego reemplazando esas coordenadas por los datos de las matrices a multiplicar quedaria asi:
Nota:Ya en este punto Multiplicacion [ i, j ] a acumulado el 20 y ya no vale 0
Multiplicacion [ 1, 1 ]=5*1+20
Multiplicacion [ 1, 1 ] =25
c) Luego de esto se ejecuta el for de z otra vez  la z en 1 y ahora vale 3 y se realiza de nuevo la operacion.

Multiplicacion [ i, j ] = Matriz1 [ i, z ] * Matriz2 [ z, j ] + Multiplicacion [ i, j ] ya reemplazando esto quedaria asi:
Multiplicacion [ 1, 1 ] = Matriz1 [ 1, 3 ] * Matriz2 [ 3, 1 ] + Multiplicacion [ 1, 1 ]

Luego reemplazando esas coordenadas por los datos de las matrices a multiplicar quedaria asi:
Nota:Ya en este punto Multiplicacion [ i, j ] a acumulado el 25
Multiplicacion [ 1, 1 ]=6*2+25
Multiplicacion [ 1, 1 ] =37
d) Luego de eso z se incrementa otra vez al no cumplir la condicion el bucle de z termina y pasa al for de j este se incrementa en 1 y entra en el for de "z" que de nuevo empieza en el valor inicial osea 1 luego llega un punto en el cual "j" ya no cumple la condicion y termina y despues de eso se pasaria al bucle de "i" y y z se reiniciarian a 1 luego de que "i" no cumpla la condicion terminaria el funcionamiento de los fors.

for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Multiplicacion [ i, j ] = 0 ;
                        for ( int z = 1 ; z <= c1 ; z ++ ) {
                            Multiplicacion [ i, j ] = Matriz1 [ i, z ] * Matriz2 [ z, j ] + Multiplicacion [ i, j ] ;  } } }

Paso 7: Luego de haber obtenido la matriz resultante se la muestra mediante dos for anidados y se usa un salto de linea al final del primer for para que en pantalla se muestre la matriz en forma ordenada.

            Console. WriteLine ( "Multiplicacion de 2 Matrices" ) ;
                for ( int i = 1 ; i <= f1 ; i ++ ) {
                    for ( int j = 1 ; j <= c2 ; j ++ ) {
                        Console. Write ( "{0} " , Multiplicacion [ i, j ] ) ;
                    }
                    Console. WriteLine ( ) ;
                } }
 Paso 8: Aqui se muestra un mensaje de error al usuario advirtiendole que el numero de columnas de la matriz 1 no es igual al numero de filas de la matriz 2.
Nota: Este paso solo se ejecutara en caso de no haberse cumplido la condicion del if

0 comentarios:

Publicar un comentario en la entrada