Les dejo un programa que hice hace un tiempo ...
Código C:
Ver original
/* * Nombre de programa: Operaciones con Matrices * Descripcion: ... * * * Autor: _Lx * Fecha: N/A * */ #include <stdio.h> #include <stdlib.h> #include <conio.h> int const LIMIT = 20 ; /* int const L1 = 20; int const L2 = 20; void LEER_MTRZ( float X[L_1][L_2], int *DIM_X_A, int *DIM_X_B ); void MST_MTRZ( float X[L_1][L_2], int DIM_X_A, int DIM_X_B ); */ void LEERC_MTRZ( float X[LIMIT][LIMIT], int *DIM_X ); void MSTC_MTRZ ( float X[LIMIT][LIMIT], int DIM_X ); float DET_MTRZ ( float X[LIMIT][LIMIT], int DIM_X ); void TRANS_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X_A, int DIM_X_B, int *DIM_Y_A, int *DIM_Y_B); int COFAC_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ); int ADJ_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ); int INV_MTRZ ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ); int main() { float MTRZ_1[LIMIT][LIMIT], MTRZ_2[LIMIT][LIMIT]; int DIM_1, DIM_2, C, PX, PY; LEERC_MTRZ(MTRZ_1, &DIM_1); MSTC_MTRZ( MTRZ_1, DIM_1 ); if( DIM_1 > 0 ){ } if(INV_MTRZ( MTRZ_1, MTRZ_2, DIM_1, &DIM_2)){ MSTC_MTRZ( MTRZ_2, DIM_2 ); } return(0); } void LEERC_MTRZ( float X[LIMIT][LIMIT], int *DIM_X ){ int DIM; float TEMP; if( DIM < LIMIT){ if( DIM > 0 ) for( int i = 0 ; i < DIM ; i++ ){ for( int j = 0 ; j < DIM ; j++ ){ X[i][j] = TEMP; } } *DIM_X = DIM; } else{ } } void MSTC_MTRZ( float X[LIMIT][LIMIT], int DIM_X ){ if( DIM_X <= 0 ) else{ if( DIM_X <= 5 ){ for( int i = 0 ; i < DIM_X ; i++ ){ } for( int i = 0 ; i < DIM_X ; i++ ){ for( int j = 0 ; j < DIM_X ; j++ ){ } } } } } /* void LEER_MTRZ( float X[L_1][L_2], int *DIM_X_A, int *DIM_X_B ){ int DIM_1, DIM_2; float TEMP; printf("\nIngrese la 1ra dimension de la matriz: "); scanf("%d", &DIM_1); printf("\nIngrese la 2da dimension de la matriz: "); scanf("%d", &DIM_2); printf("\n"); if( DIM_1 < L_1 && DIM_2 < L_2){ if( DIM_1 > 0 && DIM_2 > 0 ){ printf("Ingresando elementos ... \n\n"); for( int i = 0 ; i < DIM_1 ; i++ ){ for( int j = 0 ; j < DIM_2 ; j++ ){ printf("[%d][%d]: ", i+1, j+1); scanf("%f", &TEMP); X[i][j] = TEMP; } } *DIM_X_A = DIM_1; *DIM_X_B = DIM_2; } else{ printf("Dimension(es) fuera de rango ...\n\n"); system("pause"); exit(0); } } void MST_MTRZ( float X[L_1][L_2], int DIM_X_A, int DIM_X_B ){ if( DIM_X_A <= 0 || DIM_X_B <= 0) printf("\n\nLa matriz no tiene elementos"); else{ printf("\nMostrando Matriz:\n\n"); for( int i = 0 ; i < DIM_X_A ; i++ ){ printf("{ "); for( int j = 0 ; j < DIM_X_B ; j++ ){ printf("%9.2f", X[i][j]); } printf(" }\n"); } } } */ void ELIMFC_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int FILA, int COLUM ){ for( int i = FILA + 1 ; i < DIM_X ; i++ ){ for( int j = COLUM + 1 ; j < DIM_X ; j++ ){ Y[i-1][j-1] = X[i][j]; } } if( COLUM > 0 ){ for( int i = FILA + 1 ; i < DIM_X ; i++ ){ for( int j = 0; j < COLUM ; j++ ){ Y[i-1][j] = X[i][j]; } } } if( FILA > 0 ){ for( int i = 0 ; i < FILA ; i++ ){ for( int j = COLUM + 1 ; j < DIM_X ; j++ ){ Y[i][j-1] = X[i][j]; } } if( COLUM > 0 ){ for( int i = 0 ; i < FILA ; i++ ){ for( int j = 0; j < COLUM ; j++ ){ Y[i][j] = X[i][j]; } } } } } float POW( float X, int N){ float P = 1.; for( int i = 1 ; i <= N ; i++ ){ P = P * X ; } return P; } float DET_MTRZ( float X[LIMIT][LIMIT], int DIM_X){ // Prb17. float DET = 0; float A[LIMIT][LIMIT]; if( DIM_X == 1 ) DET = X[0][0]; else if( DIM_X == 2 ) DET = X[0][0] * X[1][1] - X[0][1] * X[1][0] ; else if( DIM_X > 2 ){ for( int i = 0 ; i < DIM_X ; i++ ){ ELIMFC_MTRZ( X , A, DIM_X, 0, i); DET+= X[0][i] * POW( -1, i)* DET_MTRZ( A , DIM_X-1); } } return DET; } void TRANS_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X_A, int DIM_X_B, int *DIM_Y_A, int *DIM_Y_B){ // Prb11b. // No es necesario que la matriz sea cuadrática para esta función. for( int i = 0 ; i < DIM_X_A ; i++ ){ for( int j = 0 ; j < DIM_X_B ; j++ ){ Y[j][i] = X[i][j]; } } *DIM_Y_A = DIM_X_B; *DIM_Y_B = DIM_X_A; } int COFAC_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){ float A[LIMIT][LIMIT]; int R = 0; if( DIM_X > 1){ for( int i = 0 ; i < DIM_X ; i++ ){ for( int j = 0 ; j < DIM_X ; j++ ){ ELIMFC_MTRZ( X , A, DIM_X, i, j); Y[i][j] = POW( -1, i + j )* DET_MTRZ( A , DIM_X-1); } } R = 1; } *DIM_Y = DIM_X; return R; } int ADJ_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){ float Z[LIMIT][LIMIT]; int DIM_Z, R = 0; if( DIM_X > 1 ){ COFAC_MTRZ( X , Z , DIM_X, &DIM_Z ); TRANS_MTRZ( Z , Y , DIM_Z, DIM_Z, DIM_Y, DIM_Y ); R = 1; } else *DIM_Y = DIM_Z; return R; } int INV_MTRZ( float X[LIMIT][LIMIT], float Y[LIMIT][LIMIT], int DIM_X, int *DIM_Y ){ // Prb12=16. float Z[LIMIT][LIMIT]; int DIM_Z, R = 0; float DET = DET_MTRZ( X , DIM_X ); if( DET != 0. || DIM_X < 1){ if( DIM_X > 1 ){ ADJ_MTRZ( X , Z , DIM_X, &DIM_Z ); for( int i = 0 ; i < DIM_Z ; i++ ){ for( int j = 0 ; j < DIM_Z ; j++ ){ Y[i][j] = Z[i][j] / DET; } } R = 1; } else } else *DIM_Y = DIM_Z; return R; }
Espero les sirva ...