int main(void) { int n = 0, result; double tol = 0.f; double **A, **B, **C = NULL; double **copiaA = NULL; /* Leer dimensiones */ printf("\nDimensiones matriz: "); scanf("%d", &n); /* Leer tolerancia */ printf("\nTolerancia: "); scanf("%lf", &tol); /* Leer matriz */ printf("\nMatriz ecuaciones (A):"); A = leer_matriz(n, n); B = gen_matriz(n,n); C = gen_matriz(n,n); copiaA = gen_matriz(n,n); copiar_en_matriz(n,A,copiaA); /* Calcular matriz inversa */ result = inversaA(n,A,B,tol); if(result==KO){ printf("\nNo tiene matriz inversa"); } else { printf("\nSolucion: Matriz inversa:"); mostrar_matriz(n,n,B); } /* Comprobar que el producto nos da la identidad C = A·B */ prodMatMat(n,copiaA,B,C); printf("\nComprobar solucion\n(deberia salir una matriz identidad)"); mostrar_matriz(n,n,C); return 0; }
void multiplicacion_matriz(int **a, int **b, int **c, int fila1, int fila2, int columna2) { int i, j, k; for(i=0; i<fila1; i++) { for(j=0; j<columna2; j++) { for(k=0; k<fila2; k++) { *(*(c+i)+j) = *(*(c+i)+j) + *(*(a+i)+k) * *(*(b+k)+j); } } } mostrar_matriz(fila1, columna2,c); }
int inversaA(int n, double **A, double **B, double tol){ int i,j,k; double c,d; double det; mostrar_matriz(n,n,A); det = determinante_matriz(A,n); if(det==0){ /* Si det = 0, no tiene inversa */ return KO; } /* Crear matriz identidad */ for (i=0 ; i<n ; i++) { for(j=0;j<n;j++){ if(i==j){ /* Rellenar diagonal con 1's */ B[i][j] = 1; } else { /* El resto 0's */ B[i][j] = 0; } } } /* Pivoteando */ for(i=n-1;i>0;i--) { if( A[i-1][0] < A[i][0] ) { /* Si es menor hay que cambiar fila */ for(j=0;j<n;j++) { /* pivotar A */ c = A[i][j]; A[i][j]=A[i-1][j]; A[i-1][j]=c; /* pivotar B */ d = B[i][j]; B[i][j]=B[i-1][j]; B[i-1][j]=d; } } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(j!=i) { if(fabs(A[j][i])<tol){ A[j][i] = 0; } d = A[j][i]/A[i][i]; for(k=0;k<n;k++){ /* Operar sobre A */ A[j][k] -= A[i][k] * d; /* Operar sobre B */ B[j][k] -= B[i][k] * d; } } } } for(i = 0; i<n; i++) { d = A[i][i]; for(j = 0;j<n;j++) { /* divison sobre ambas */ A[i][j] = A[i][j]/d; B[i][j] = B[i][j]/d; } } return OK; }