Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: Berman en 30 Abril 2016, 18:00 PM

Título: Ayuda con este programa para multiplicar matrices!!
Publicado por: Berman en 30 Abril 2016, 18:00 PM
Buenas. He estado intentado hacer un programa que multiplique matrices ya sean 3x3,2x2...etc pero no consigo hacer que funcione.

Este es mi código:
Código (java) [Seleccionar]

import java.util.Scanner;
public class Matriz {

    public static void main(String[] args) {
        System.out.println("Matriz 1");
        System.out.println("Numero de filas");
        int fila;
        Scanner sc=new Scanner(System.in);
        fila=sc.nextInt();
        System.out.println("Numero de columnas");
        int columna;
        Scanner sccol=new Scanner(System.in);
        columna=sccol.nextInt();
        System.out.println("Numeros de la matriz 1:");
        int matriz[][]=new int [fila][columna];
        for(int j=(columna-1);j>=0;j--){
            for(int i=0;i<fila;i++){
                int numeros;
                Scanner scnum=new Scanner(System.in);
                numeros=scnum.nextInt();
                matriz[i][j]=numeros;
            }
        }
        System.out.println("Matriz 2");
        System.out.println("Numero de filas");
        int fila2;
        Scanner sc2=new Scanner(System.in);
        fila2=sc2.nextInt();
        while(columna!=fila2){
            System.out.println("Error.Vuelve a introducir las filas de la matriz");
            int filaexp;
            Scanner scexp=new Scanner(System.in);
            filaexp=scexp.nextInt();
            fila2=filaexp;
        }
        System.out.println("Numero de columnas:");
        int columna2;
        Scanner sccol2=new Scanner(System.in);
        columna2=sccol2.nextInt();
        System.out.println("Numeros de la matriz 2:");
        int matriz2[][]=new int [fila2][columna2];
        for(int j=(columna2-1);j>=0;j--){
            for(int i=0;i<fila2;i++){
                int numeros2;
                Scanner scnum2=new Scanner(System.in);
                numeros2=scnum2.nextInt();
                matriz2[i][j]=numeros2;
            }
        }
        System.out.println("Matriz 1:");
        for(int j=(columna-1);j>=0;j--){
            for(int i=0;i<fila;i++){
                System.out.print(" "+matriz[i][j]+" ");
            }System.out.println("");
        }
        System.out.println("Matriz 2:");
        for(int j=(columna2-1);j>=0;j--){
            for(int i=0;i<fila2;i++){
                System.out.print(" "+matriz2[i][j]+" ");
            }System.out.println("");
        }
        System.out.println("Resultado");
        int matriz3[][]=new int [fila][columna2];
        for(int i=0;i<fila;i++){
            for(int j=0;j<columna2;j++){
                for(int k=(columna-1);k>=0;k--){
                    matriz3[i][j]+=matriz[k][j]*matriz2[i][k];
                }
            }
        }
        for(int j=(columna2-1);j>=0;j--){
            for(int i=0;i<fila;i++){
                System.out.print(" "+matriz3[i][j]+" "); 
            }System.out.println(" ");
        }
    }
}


El problema debe estar en los 3 for, en la parte de resultado, pero por mas que lo intento no lo consigo. Gracias de antemano!!
Título: Re: Ayuda con este programa para multiplicar matrices!!
Publicado por: + 1 Oculto(s) en 2 Mayo 2016, 04:32 AM
lo primero es que siempre te concentres sobre la logica del programa
en tu caso es multiplicar matrices asi que borra el scanner y crea 2 matrices estaticas

saludos
Título: Re: Ayuda con este programa para multiplicar matrices!!
Publicado por: Berman en 2 Mayo 2016, 18:07 PM
El Scanner lo uso para que el usuario pueda poner los números que quiera en la matriz, al final después de muchos intentos he conseguido que funcione!! Gracias y cierro tema.
Título: Re: Ayuda con este programa para multiplicar matrices!!
Publicado por: + 1 Oculto(s) en 3 Mayo 2016, 17:53 PM
una vez que funcione con esas 2 matrices estaticas como siguiente paso puedes poner scanner

bueno solo es un consejo ...
saludos
Título: Re: Ayuda con este programa para multiplicar matrices!!
Publicado por: hectornunezrivas en 25 Junio 2016, 08:14 AM
Buenas noches.
Te paso el codigo que siempre eh utilizado para la multiplicacion de matrices.

Código (java) [Seleccionar]
class MultiplicacionMatrices{

//Me extrae una fila dada de una matriz en forma de vector (arreglo)
public static int []filaMatriz(int [][]matriz, int fila){
 int []arregloAuxiliar = new int[matriz[fila].length];
 for(int i = 0; i < arregloAuxiliar.length; i++){
  arregloAuxiliar[i] = matriz[fila][i];
 }
 return arregloAuxiliar;
}

//Me extrae una columna dada de una matriz en forma de vector (arreglo)
public static int []columnaMatriz(int [][]matriz, int columna){
 int []arregloAuxiliar = new int[matriz.length];
 for(int i = 0; i < arregloAuxiliar.length; i++){
  arregloAuxiliar[i] = matriz[i][columna];
 }
 return arregloAuxiliar;
}

//Me devuelve el valor de una celda segun la multiplicacion de dos matrices
public static int valorCelda(int [][]matrizA, int [][]matrizB, int fila, int columna){
 int suma = 0;
 /*
 Tomo la fila de la primera matriz y la columna de la segunda matriz,
 para posteriormente multiplicar celda por celda
  */
 int []filaMatrizA = filaMatriz(matrizA, fila);
 int []columnaMatrizB = columnaMatriz(matrizB, columna);  
 
  for(int i = 0; i < filaMatrizA.length; i++){
   
   /*
    * Aqui valido que la longitud de ambos vectores sean iguales,
    * en terminos mas acordes, que el numero de columnas de la primera matriz,
    * sea igual al numero de filas de la segunda matriz    
   */
   
   if(filaMatrizA.length == columnaMatrizB.length){
   suma += filaMatrizA[i] * columnaMatrizB[i];
   }else{
    System.out.println("El numero de columnas de la primera matriz es diferente al numero de filas de la segunda matriz");
    break;  
   }      
  }  
   
 return suma;
  }
 
  //Me devuelve una matriz, producto de la multiplicacion de dos matrices
public static int [][]multiplicacionMatriz(int [][]matrizA, int [][]matrizB){
 int [][]matrizAuxiliar = new int[matrizA.length][matrizA[0].length];
 for(int i = 0; i < matrizA.length; i++){
  for(int j = 0; j < matrizA[i].length; j++){
   matrizAuxiliar[i][j] = valorCelda(matrizA, matrizB, i, j);    
  }
 }
 return matrizAuxiliar;
}
//imprime los valores de una matriz
public static void imprimirMatriz(int [][]matriz){
 System.out.println("-------------------------------");
 for(int i = 0; i < matriz.length; i++){
  for(int j = 0; j < matriz[i].length; j++){
   System.out.print(matriz[i][j]+"\t");
  }
  System.out.println();
 }
 System.out.println("-------------------------------");
}

//imprime el procedimiendo de la 'matriz de recorrido' de una matriz
public static void main(String []args){
 /*
 Nota importante:
 - Sean las matrices A y B; A tenga el mismo número de columnas que B de filas para que  exista A*B
 - Sean las matrices B y A; B tenga el mismo número de columnas que A de filas para que  exista A*B
 */
 int [][]matrizA ={{1,0,0,1},
       {1,4,0,1},
       {1,9,0,11},
       {1,5,6,0}};
       
 int [][]matrizB ={{11,0,0,1},
       {1,8,0,1},
       {0,9,0,5},
       {1,7,6,0}};
 
 System.out.println("Matriz A");      
 imprimirMatriz(matrizA);
 
 System.out.println("Matriz B");      
 imprimirMatriz(matrizB);
 
 System.out.println("Matriz A * Matriz B");  
 imprimirMatriz(multiplicacionMatriz(matrizA,matrizB));
 
 
 //Note que si A y B son diferentes A*B diferente de B*A (A*B <> B*A)
 System.out.println("Matriz B * Matriz A");  
 imprimirMatriz(multiplicacionMatriz(matrizB,matrizA));
}

}


Espero te sirva!


Mod: Los códigos deben ir en etiquetas GeSHi