Ayuda con este programa para multiplicar matrices!!

Iniciado por Berman, 30 Abril 2016, 18:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Berman

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!!

+ 1 Oculto(s)

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

Berman

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.

+ 1 Oculto(s)

una vez que funcione con esas 2 matrices estaticas como siguiente paso puedes poner scanner

bueno solo es un consejo ...
saludos

hectornunezrivas

#4
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