Calcular determinante de una matriz

Aprovechando que he tenido un poco de tiempo libre mientras trabajaba, he aprovechado para hacer un programilla en Java, para que no se me vaya olvidando el lenguaje.

Esto es una aplicación que crea una matriz de tamanno x tamanno (en este ejemplo, he puesto 6x6), y calcula su respectivo determinante a base de llamar a un algoritmo recursivo que se va llamando a si mismo hasta llegar a una matriz de 2x2.

Dejo el código fuente.

Determinante.java
class Determinante
{
 public static void main(String args[])
 {
  int tamanno = 6, i, j;
  int matriz[][] = new int[tamanno][tamanno];
  for (i=0;i<tamanno;i++)
  {
   for (j=0;j<tamanno;j++)
   {
    matriz[i][j] = (int)(Math.random()*10)-5;
   }
  }

  printmat(matriz);

  System.out.println(determin(matriz));
 }

 public static void printmat(int matriz[][])
 {
  int i, j;
  for (i=0;i<matriz.length;i++)
  {
   for (j=0;j<matriz.length;j++)
    System.out.print(String.valueOf(matriz[i][j]) + "\t");
   System.out.println();
  }
  System.out.println();
 }

 public static int[][] submatrize(int matriz[][], int x, int y)
 {
  int submatriz[][] = new int[matriz.length-1][matriz.length-1];
  int i, j, cur_x=0, cur_y=0;
  for (i=0;i<matriz.length;i++)
  {
   if (i != x)
   {
    cur_y=0;
    for (j=0;j<matriz.length;j++)
    {
     if (j != y)
     {
      submatriz[cur_x][cur_y] = matriz[i][j];
      cur_y++;
     }
    }
    cur_x++;
   }
  }
  return submatriz;
 }

 public static int determin(int matriz[][])
 {
  int deter=0;
  int i, mult = 1;
  if (matriz.length > 2)
  {
   for (i=0;i<matriz.length;i++)
   {
    deter += mult * matriz[i][0] * determin(submatrize(matriz,i,0));
    mult *= -1;
   }
   return deter;
  }else
   return matriz[0][0] * matriz[1][1] - matriz[0][1] * matriz[1][0];
 }
}

Resultados:
5x5
run:
-3        -4        -1        -4        -5        1        
-2        -5        -4        1        -4        -3        
0        0        -3        -3        2        -4        
1        1        0        -4        -3        0        
4        -2        -3        -4        2        2        
0        3        -2        4        3        -4        

9756
BUILD SUCCESSFUL (total time: 0 seconds)

10x10
run:
-5        -3        0        -2        4        -5        0        -2        3        -5        
1        3        -3        1        2        2        -1        0        -4        -4        
-5        -5        3        0        1        -4        3        4        -1        2        
-1        2        -4        -1        4        -2        -3        3        -2        2        
1        -3        -1        1        -1        -2        -4        1        0        1        
2        2        1        1        3        1        3        -5        -4        -1        
3        -3        -4        1        -3        4        1        4        -2        -2        
-5        -5        2        -5        1        -1        1        -3        -5        3        
1        -4        -4        2        -5        -5        1        4        3        4        
0        -5        -3        -5        2        1        -1        -1        -3        -4        

71736511
BUILD SUCCESSFUL (total time: 2 seconds)

A partir de ahi los tiempos de ejecución se disparan

2 comentarios:

fabres21s dijo...

Oye muchas gracias por ese código, he estado trabajando en una aplicación de Análisis Numérico y lo necesitaba, traté de hacerlo solo, pero no tuve en cuenta una serie de condiciones que tú sí.
Gracias de nuevo...

fabres21s dijo...

Oye muchas gracias por el código, he estado trabajando en una aplicación de Análisis Numérico y lo necesitaba, traté de hacerlo pero no tuve en cuenta una serie de condiciones.
Muchas gracias...

Publicar un comentario