lunes, 30 de mayo de 2011

Multiplicación de Matrices en Java

Presento este programa clásico ahora en java. Se pueden encontrar también en este blog las versiones en C: Multiplicación de Matrices en C y en C++:Multiplicación de Matrices en C++. El algoritmo central es el mismo. El problema debe atacarse pensando primero en la multiplicación de dos vectores (un ciclo for), depués en un vector por una matriz (dos ciclos for) y finalmente dos matrices (tres ciclos for). Esto puede verse en el método Multiplicar. Como todos los programas, basta copiar y pegar en un editor de texto el código aquí presentado. Este programa recibe las matrices, las multiplica e imprime el resultado. En realidad el corazón del programa (la multiplicación) son unas cuántas líneas de código. Es más complicado presentar los resultados en pantalla. De todas formas creo que eso es muy útil para el usuario final y por eso lo incluyo.


El siguiente código debe guardarse con el nombre UsaMultiplicacion.java


public class UsaMultiplicacion

  {                   // Abre clase UsaMultiplicacion

   public static void main(String args[])
   {       // Abre main
   
   Multiplicacion miObjeto = new Multiplicacion();

   // Llamada a Recibe_Entradas1()
   miObjeto.Recibe_Entradas1();

   // Llamada a Recibe_Entradas2()
   miObjeto.Recibe_Entradas2();

   //Llamada a Multiplicar
   miObjeto.Multiplicar();

   //Llamada a metodo Imprime
   miObjeto.Imprimir();

   }       // Cierra main
  }              // Cierra clase UsaMultiplicacion
El siguiente código debe guardarse con el nombre Multiplicacion.java
 import java.util.Scanner;

 public class Multiplicacion

{                 // Abre clase Multiplicacion

    //Si se quiere multiplicar matrices de distinta dimension 
    //solo hay que cambiar los valores de M, N y P
    private int M = 3;
    private int N = 2;
    private int P = 4;
    private int Matriz1[][] = new int[N][M];
    private int Matriz2[][] = new int[M][P];
    private int Matriz3[][] = new int[N][P];

        Scanner entrada = new Scanner(System.in);


    //Metodo Recibe_Entradas1
    public void Recibe_Entradas1()

    { // Abre metodo Recibe_Entradas1
          
    System.out.printf("\nEste programa multiplica una matriz de %d columnas y %d renglones", M, N);
    System.out.printf(" con una de %d columnas y %d renglones\n\n", P, M);
    System.out.print("\nAqui se reciben las entradas de la primera matriz " );
    System.out.printf("de %d filas y %d columnas.\n", M, N );


    for ( int i = 0; i < N; i++ )
    for ( int j = 0; j < M; j++ )

    { // Abre for
    System.out.printf("Introduzca el valor de la entrada en el renglon %d  y la columna %d: ", i + 1,  j + 1 );
    Matriz1[i][j] = entrada.nextInt();
        } // Cierra for
    } // Cierra metodo Recibe_Entradas1



    public void Recibe_Entradas2( )

    { // Abre metodo Recibe_Entradas2

    System.out.print("\nAqui se reciben las entradas de la segunda matriz " );
    System.out.printf("de  %d  filas y %d columnas", M, P);

    for ( int i = 0; i < M; i++ )
    for ( int j = 0; j < P; j++ )
    { // Abre for
    System.out.printf("\nIntroduzca el valor en el renglon %d y la columna %d: ",  i + 1,  j + 1 );
        Matriz2[i][j] = entrada.nextInt();
            } // Cierra for

    } // Cierra metodo Recibe_Entradas2



    // Metodo Multiplicar
    public void Multiplicar( )

    { // Abre metodo Multiplicar

    for ( int k = 0; k < N; k++)
    { // abre primer ciclo for
    for ( int j = 0; j < P; j++)
    { // abre el segundo ciclo for
    for ( int i = 0; i < M; i++ )
    Matriz3[ k ][j ] += Matriz1[k][i]*Matriz2[i][j];

    } // Cierra el segundo ciclo for
    }

    } // Cierra el metodo Multiplicar



        
  void Imprimir( )
  {  // Abre metodo Imprimir
  // Aqui se imprimen la dos matrices y la matriz producto
  int i, j, k;

  System.out.printf("\n\nAQUI SE IMPRIMEN LAS DOS MATRICES Y EL PRODUCTO: \n\n");
  for ( i = 0; i < N; i++ )
  { // abre for que controla numero de renglones

  // Este ciclo imprime la primera matriz
  // No hay ningun problema para imprimir la primera matriz, ya que se
  // trata de un par de ciclos for. Sin embargo se quiere imprimir las
  // tres matrices, lo cual hace un poquito mas complicado el asunto.
  // De todas formas la primera se imprime renglon por renglon
  // solo que antes de pasar al siguiente renglon, se escriben las entradas
  // correspondientes de la segunda y tercera matrices.

  for ( k = 0; k < M; k++)
  { // Abre ciclo for
  System.out.printf("%3d", Matriz1[i][k]);
  // Se imprime el renglon i de la matriz 1
  } //Cierra ciclo for

  System.out.printf("\t\t"); // Esta instruccion separa una matriz de otra

  // Este ciclo imprime la segunda matriz

  for ( j = 0; j < P; j++)
  { // abre for
  if ( i <= (N - 1)) // El numero de columnas de la segunda matriz puede ser
  // menor o mayor que el numero de filas de la primera
  // Si es mayor no pasa nada, pero si es menor se estara
  // haciendo referencia a un elemento inexistente en el arreglo
  // El caso en el que N > M se trata fuera del ciclo controlado por i
  // El -1 es debido a que i empieza a correr en cero

  System.out.printf("%3d", Matriz2[i][j]); // se imprime el renglon i de la matriz 2

  else // De lo contrario solo se imprimen 3 espacios en blanco
     // correspondientes con 3d

  System.out.printf(" ");
  } // Cierra for

  System.out.printf ("\t\t"); // Esta instruccion separa la matriz 2 de la matriz
                 // producto

  // Este es el ciclo que imprime la matriz producto
  for ( j = 0; j < P; j++ )
  { // abre for
  System.out.printf("%3d", Matriz3[i][j]);
  // se imprime el renglon i de la matriz producto
  } // Cierra for

  System.out.printf("\n");
  // Aqui se cambia de renglon
  } // Cierra for que controla numero de renglones

  // Es probable que N > M, por lo cual en el ciclo anterior no se
  // imprimiria la segunda matriz en su totalidad
  // Con el siguiente bloque se imprime lo que falta

  if ( M > N)
  { // Abre if
  int l = N;

  while ( l < M )
  { // Abre while
  for ( i = 0; i < M; i++)
  System.out.printf(" ");
  System.out.printf("\t\t\t");      
  for ( j = 0; j < P; j++ )
  System.out.printf("%3d", Matriz2[l][j]);
  System.out.printf("\n"); // Aqui se cambia de linea
  l++; // Se incrementa el numero de linea
  } // Cierra while
  } // Cierra if
  }  // Cierra metodo Imprimir

}       // Cierra clase Multiplicacion

27 comentarios:

  1. Muy buena aportacion!! =) me fue de mucha utilidad
    gracias!! =D

    ResponderEliminar
  2. Gracias a ti, qué bueno que te sirvió. ¡Saludos!

    ResponderEliminar
  3. Sabras hacer una multiplicacion de un vector por una matriz y una matriz por un escalar? Me esta volviendo loco xD

    ResponderEliminar
    Respuestas
    1. En realidad las dos cosas son bastante fáciles. Para lo primero simplemente establece la variable global N = 1 en este programa. Y ya está. Lo segundo es todavía más fácil.

      1) Define el tamaño de tu matriz (recuerda que en Java el primer subíndice de un arreglo bidimensional representa a los renglones y el segundo a las columnas)

      2) Recibe los elementos de la matriz. En el programa de arriba viene cómo recibir los valores. También los puedes poner en la declaración del arreglo, según prefieras.

      3) Recibes un número de parte del usuario (recuerda que lo tienes que declarar primero)

      4) Haces un par de ciclos for anidados. El primero que corra sobre las columnas y el segundo sobre las filas. En el cuerpo de los dos ciclos vas a poner simplemente una instrucción del tipo

      A[fila][columna] *= c;

      y ya está.

      Puedes imprimir la matriz si quieres para verla. Eso también es fácil e incluye un par de ciclos for.

      Eliminar
  4. me gustaría que me ayuden.


    2012/5/12 Starlin Guevara


    import java.util.*;
    import javax.swing.JOptionPane;
    public class Vectores {

    public static void main(String [] args){
    int i;
    int num=0;
    int numero;
    int suma;
    int sumapares=0;
    Vector pares = new Vector();
    Vector impares = new Vector();
    Vector v3 = new Vector(pares);
    Vector v4 = new Vector(impares);
    Scanner leer = new Scanner(System.in);


    String input = JOptionPane.showInputDialog("Entre la cantidad de elementos del vector");
    num = Integer.parseInt(input);


    for( i=0; i<num; i++){
    String entrada = JOptionPane.showInputDialog("Entre Un Numero");
    numero = Integer.parseInt(entrada);

    if(numero%2==0){
    pares.add(numero);
    }

    else if(numero%2!=0){
    impares.add(numero);
    }




    }


    for(int j=0; j<pares.size(); j++){
    JOptionPane.showMessageDialog(null,"Pares :"+pares.get(j));
    }


    for(int k=0; k<impares.size(); k++){
    JOptionPane.showMessageDialog(null,"Impares :"+impares.get(k));


    }



    }

    }

    necesito que me multiplica los números pares y impares.

    ResponderEliminar
  5. silos números pares son 4 6 2
    y los impares son 3 1 5
    el resultado sera 36 54 18

    ResponderEliminar
  6. Hola. No me queda claro lo que pides. Por la forma en la cual de

    4, 6, 2
    3, 1, 5
    obtienes
    36, 54, 18

    Y hasta donde puedo ver, lo que hace tu código es recibir números y ponerlos en el vector de pares si son divisibles entre 2 y en el de impares si no lo son. Posteriormente con un par de ciclos for imprimes los valores de cada vector. Lo que quieres es que tu programa multiplique cada par por cada uno de los impares.
    Para hacer esto necesitas definir un vector Producto de tamaño n e inicializarlo a 0 y un par de ciclos for:

    for ( n = 0; n < pares.size(); n++)
    for ( m = 0; m < impares.size(); m++)
    { /*Abre for anidado*/
    Producto.add(n) += pares.get(n)*impares.get(m);
    } /*Cierra for anidado*/

    Espero que te sirva. Estoy tratando de seguir lo que escribiste, porque yo no conozco el uso de vectores en java, yo lo habría resuelto con arreglos. Tal vez tengas que corregir la sintaxis.

    ResponderEliminar
  7. Me podrian colaborar con una matriz, de 4 filas y el usuario ingresa el numero de columnas de 1 hasta 200. En la primera fila va el factorial del numero de acuerdo al numero de columnas ingresados por el usuario. En la segunda fila la serie fibonacci. En la tercera fila va el area de un rectangulo, el numero de la columna por 2 es la base y la altura es el numero de la fila por 5, se suman todas la areas hasta el numero ingresado inicialmente el usuario. La cuarta fila va el volumen de una piramide con base cuadrada, en donde el area del cuadrado es el valor factorial de esa columna y la altura es la columna, luego se suman los volumenes hasta el numero ingresado inicialmente por el usuario.

    ResponderEliminar
  8. ¡Hola, Jorge! Estos días estoy bastante ocupado para escribir el código, sin embargo, creo que debes hacer una serie de métodos que hagan lo siguiente:
    Le envíes el número de columna y te regrese el factorial.Puedes tomar el código de Este programa
    Envíes el número de columna y te regrese el número de Fibonacci. Aquí tienes el código en java. También puedes ver Esta entrada.
    No entiendo muy bien qué pides en las otras filas, pero se puede hacer con los códigos de arriba.
    200 es un número muy grande para calcular factoriales y números de Fibonacci. Vas a tener problemas con la memoria en esos casos.
    Saludos.

    ResponderEliminar
  9. el metodo multiplicar esta mal solo se hace con 2 for y ya.

    public static void sumatrix() throws Exception {
    for ( int j = 0 ; j < 2 ; j++ )
    {
    for ( int i = 0 ; i < 2 ; i++ )
    {
    matrizsuma[i][j] = matriz1[i][j] + matriz2[i][j];
    }
    }

    ResponderEliminar
    Respuestas
    1. Creo que no sabes multiplicar matrices.

      Eliminar
  10. ¡Hola! Decir que está mal es, por lo menos, una exageración. No entiendo el segmento de código que escribiste, por lo cual no puedo comentarlo, pero el código de la entrada está bien. Saludos.

    ResponderEliminar
  11. hola, hay forma que este ejercicio adicione que siga multiplicando hasta que llegue a 0 toda la matriz resultante? y que muestre todas las multiplicaciones que hizo? ademas que me grafique la matriz inicial, estoy viendo grafos, las matrices se componen por solos 1 y 0

    ResponderEliminar
    Respuestas
    1. Éste programa imprime las matrices que se multiplican. Lo otro que dices no lo entiendo, Las multiplicaciones renglón por columna se presentan en la matriz producto. "Hasta que llegue a 0 toda la matriz" es algo que no entiendo. No hay razón para ésto, a menos de que multipliques sucesivamente matrices cuyas entradas sean menores que cero. Creo que estás confundiendo la multiplicación de matrices con alguna otra cosa.
      Saludos.

      Eliminar
  12. buenas noches me colaboran con este programa..no me funciona.. 2 vectores que lleno A y B con x datos(con igual tamaño de vector) y los almaceno en un vector C(tamaño de Vect A + Vect B) y lo imprimo..ejemplo A 1235 B 4562
    C 12354562.

    Muchas gracias...te envio el programa que le estoy trabajando

    // vector que lea N posiciones y genere numeros O random para llenar las posiciones de los vectores A y B
    // imprime vector A y B verticalmente y C y D horizontalmente
    //funciona ok.

    public class ejercicio3 {


    public static void main(String[]args) {
    int i,j,N,M,O;

    N=LeerVariable.leerEntero ("cant de posiciones VECTOR ");
    M=N+N;


    O=LeerVariable.leerEntero("Digite el rango de numeros aleatorios ");

    int A[]=new int[N];
    int B[]=new int[N];
    int C[]=new int[M];



    for(i=0;i<M;i++) {

    for (i=0;i<N;i++) {

    A[i]=(int)(Math.random()*(O));
    C[i]=A[i];

    }

    for (i=0;i<N;i++) {

    B[i]=(int)(Math.random()*(O));
    C[i]=B[i];


    }

    }


    System.out.println ();

    System.out.println ("vector A");


    for(i=0;i<N;i++) {

    System.out.println( A[i]);
    }

    System.out.println ("vector B");

    for(i=0;i<N;i++) {

    System.out.println(B[i]);


    }

    System.out.println ("vector C ");


    for(i=0;i<M;i++) {

    System.out.print(C[i]+" ");

    }




    }
    }






    ResponderEliminar
    Respuestas
    1. Hola, Alex. He tratado de corregir tu programa pero la verdad es ilegible. Necesito que me digas qué exactamente quieres que haga tu código. Por favor ponlo como comentario al principio. Así como está me parece que es parte de un programa más grande y que lo (mal) copiaste en una clase. También hay varios problemas lógicos y de sintaxis, más allá de que no queda claro qué quieres hacer. Aquí algunos (puede haber más):

      1) Si vas a recibir números, necesitas poner al principio la leyenda

      import java.util.Scanner;

      y luego declarar un tipo Scanner (como el tipo entrada de el programa de multiplicación de matrices)

      2) En tus comentarios dices que se imprimirá el arreglo D, pero ese arreglo nunca se define.

      3) En el doble ciclo for modificas la variable contador i del primer ciclo en el segundo ciclo, de tal manera que nunca se cumple la condición de término. Creo que alguno de esos índices debe ser j, que la declaras tipo int.

      Te escribo un código que funciona y que hace algo que tal vez es parecido a lo que quieres:

      // vector que lea N posiciones y genere numeros O random para llenar las posiciones de los vectores A y B
      // imprime vector A y B verticalmente y C y D horizontalmente
      //funciona ok.
      import java.util.Scanner; //Linea agregada

      public class ejercicio3 {


      public static void main(String[]args) {
      int i,j,N,M,O;
      Scanner entrada = new Scanner(System.in);

      //N=LeerVariable.leerEntero ("cant de posiciones VECTOR ");
      System.out.println("\nIntroduzca la cantidad de posiciones VECTOR: ");
      N = entrada.nextInt();
      M=N+N;


      //O=LeerVariable.leerEntero("Digite el rango de numeros aleatorios ");
      System.out.println("\nDigite el rango de numeros aleatorios: ");
      O = entrada.nextInt();

      int A[]=new int[N];
      int B[]=new int[N];
      int C[]=new int[M];



      for(i=0;i<N;i++)

      A[i]=(int)(Math.random()*(O));





      System.out.println ();

      System.out.println ("vector A");


      for(i=0;i<N;i++)

      System.out.println( A[i]);



      }
      }


      Eliminar
  13. me podrias ayudar a multiplicar dos matrices? tu codigo de inicio esta muy complejo, no quiero utilizar la entrada de datos.
    tengo las siguientes matrices:

    matriz a
    5 8 4
    1 -4 2
    10 7 9

    matriz b
    45 -5
    2 6
    14 8

    y la matriz resultante seria:
    297 55
    65 -13
    590 64

    ResponderEliminar
    Respuestas
    1. Hola, Diego. Si no quieres usar la entrada de datos, sólo no llames a esos métodos, y los puedes borrar. En la declaración de los arreglos, puedes inicializarlos con los valores que tú quieras, y ya está. Lo importante realmente es el método multiplicar. Una vez que tengas las matrices que quieras, envíalas a ese método y ya está. Si las quieres imprimir, las imprimes.
      Muchos saludos. Si no sabes cómo inicializar el arreglo, me dices.

      Eliminar
  14. ola y si solo kiero multiplicar una matriz x un mismo numero como seria?

    ResponderEliminar
    Respuestas
    1. Pues ahí básicamente tienes que hacer un doble ciclo for, recorriendo cada entrada de la matriz, y multiplicas por el escalar:

      for( i = 1; i <= X; i++ )
      for( j = 1; j <= Y; j++ )

      c[i][j] *= c;

      donde c es el escalar.

      Eliminar
  15. que pena ... ensaye tu codigo (Multiplicación de Matrices en Java) y la matriz resultado se llenan de ceros, por que puede ser ??

    ResponderEliminar
    Respuestas
    1. Hola, Mauricio. La verdad no se que pueda estar pasando. ¿Ya revisaste si multiplicas por 0 en algún lado?

      Eliminar
  16. Hola buenas noches... quisiera que me ayudaran con un arreglo donde se puedan introducir 2 arreglos y el tercer arreglo lo muestre en pantalla con la suma de 2 arreglos D: la verdad ya me harte de esa tarea :(

    ResponderEliminar
  17. hola que tal,tengo una pregunta con un ejercicio bastante bobo ,pero no me sale....
    crear dos arreglos enteros,generar e imprimir por pantalla un tercer array que contenga los elementos impares del primer arreglo, y elementos pares del segundo arreglo. en java

    ResponderEliminar
  18. hola
    en la escuela un profesor me pide sobrecarcar un metodo que contenga(tablas, vectores y cubos) ademas esto debe tener tipo de datos(float,entero y double).
    los metodos que me pide es para hacer un arreglo tridimensional pero ke me retorne uno bidimensional???? me puedes ayudar

    ResponderEliminar
  19. Hola oye me podrias ayudar a realizar este programa.Ingresar el sueldo de un trabajador, Categoría, condición(Estable, contratado) y reportar el pago total que se le debe hacer de acuerdo a lo siguiente:
El porcentaje de Bonificación (respecto al sueldo) se calcula de acuerdo a la siguiente tabla:

    Categoría Estable No Estable
    A 20% 17%
    B 18% 15%
    C 15% 14%
    D 12% 10%
    El cálculo del descuento es respecto al (Sueldo + Bonificación)
Estable: 6% No estable: 4%

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...