Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juancaa en 13 Junio 2012, 02:26 am



Título: [C] [Source] Determinante Matriz orden "N"
Publicado por: juancaa en 13 Junio 2012, 02:26 am
He aqui mi nueva version remasterizada del codigo para el calculo del determinante de una matriz cuadrada de orden N.
Este codigo es lo mas simple posible para realizar el calculo del determinante de una matriz que se me ha ocurrido (62 lineas), evidentemente se puede optimizar para reducir la complejidad del algoritmo pero eso va a gusto de cada uno, yo solo comparto el codigo para aquellos que les interese.

Nota: El algoritmo calcula el determinante de una matriz de orden "N" mediante adjuntos, empieza desde la primera columna y va reduciendo hasta llegar a la ultima mediante recursividad, tan simple como eso.


Código
  1. #include <stdio.h>
  2. #define N 100
  3.  
  4. int sgn (int x) {
  5. if (x%2==0) return(1);
  6. return(-1);
  7. }
  8. int read_dim (int *dim) {
  9. int nl;
  10. char aux;
  11. printf("\nIntroduzca dimension matriz cuadrada (<100): ");
  12. nl=scanf("%d", &(*dim));
  13. if (nl!=1) {
  14. scanf("%c", &aux);
  15. while (aux!='\n')
  16. scanf("%c", &aux);
  17. }
  18. if ( (*dim>=100) || (*dim<=0) )
  19. return(0);
  20. return(1);
  21. }
  22. void read_matrix (int matrix[N][N], int dim) {
  23. int i, j;
  24. printf("\nIntroduzca elementos matriz...\n");
  25. for (i=1; i<=dim; i++) {
  26. printf("Elementos fila %d: ", i);
  27. for (j=0; j<dim; j++)
  28. scanf("%d", &matrix[i-1][j]);
  29. }
  30. }
  31. void matrix_adj (int matrix[N][N], int matrix_aux[N][N], int dim, int m, int n) {
  32. int i, j, p, q;
  33. for (j=0, q=0; j<dim; j++)
  34. if (j!=n) {
  35. for (i=0, p=0; i<dim; i++)
  36. if (i!=m) {
  37. matrix_aux[p][q]=matrix[i][j];
  38. p++;
  39. }
  40. q++;
  41. }
  42. }
  43. int det_matrix_N (int matrix[N][N], int dim) {
  44. int i, j, dim_aux, det;
  45. for (i=0, j=0, det=0, dim_aux=dim; i<dim; i++)
  46. det+=sgn(i+j)*matrix[i][j]*det_matrix_adj(matrix,dim_aux,i,j);
  47. return(det);
  48. }
  49. int det_matrix_adj (int matrix[N][N], int dim, int m, int n) {
  50. int matrix_aux[N][N];
  51. if (dim==1) return(1);
  52. matrix_adj(matrix,matrix_aux,dim,m,n);
  53. return det_matrix_N(matrix_aux,dim-1);
  54. }
  55.  
  56. main() {
  57. int dim, matrix[N][N];
  58. while (!read_dim(&dim))
  59. printf("Dimension no valida (<100).");
  60. read_matrix(matrix,dim);
  61. printf("\nDeterminante = %d.\n\n", det_matrix_N(matrix,dim));
  62. }