[ Foro de C++ ]

Multiplicacion de matrices

24-May-2022 02:35
Invitado (Margo)
0 Respuestas

Me puede decir alguien porque está mal?. Solo me sale mal la multiplicacion y no se porque es.



#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
//Defino MAX hasta 5 para que el orden de la mtrzi sea como maximo 5 y que asi la matriz no sea muy grande
#define MAX 5


//Declaro las clases para evitar posibles "warnings"
void mostrar_matriz(double matriz[][MAX], int orden);
void mostrar_gaussU(double matriz[][MAX], int orden, double matrizU[MAX][MAX]);
void multiplicacion(double identidad[][MAX], double matrizU[][MAX], double matrizMult[][MAX], int FA, int FB, int CA, int CB);
void ceros_arriba(int i, int j, int orden,double matriz[][MAX],double identidad[][MAX]);
void ceros_abajo(int i, int j, int orden,double matriz[][MAX],double identidad[][MAX]);

//Funcion main principal para realizar el programa.
int main()
{

  //declaro todas las variables que voy a usar posteriormente
  double matrizU[MAX][MAX];  //variable que almacena la matriz U
  double matrizMult[MAX][MAX];  //variable que almacena la matriz resultado de la multiplicacion de la matriz inversa y la matriz U
  double matriz[MAX][MAX];  //variable que almacena la matriz que se introduce por teclado
  int  ordenz=0;
  int FA,FB,CA,CB = orden;

  //Pido el orden de la matriz ya que tiene que ser cuadrada
  printf("\n\n\n");
printf("\n\t\tCALCULADORA DE LAS INTEGRALES DE GAUSS SEIDEL");
printf("\n\n\n");
  printf("Ingresa el orden de la matriz (maximo %d): ", MAX);
  scanf("%d", &orden);

  //Salta un error en caso de que el orden de la matriz sea menor que 0 o mayor que MAX que es el rango maximo
  while (orden < 0 || orden > MAX) {
  printf("\nEl orden de la matriz no puede ser mayor que %d\n", MAX);
  printf("Ingrese nuevamente el orden de la matriz: "); //Vuelve a pedir el orden
     scanf("%d", &orden);
  }
  //Pido los datos de la matriz
  printf("\nIngrese los elementos de la matriz:\n\n");
  for (i = 0; i < orden; i++) {
     for (j = 0; j < orden; j++) {
        scanf("%lf", &matriz[i][j]);
     }
  }

  printf("\nMostrando la matriz ingresada:\n");
  mostrar_matriz(matriz, orden);
 
  printf("Multiplicacion de 2 matrices, la matriz ingresada y la matrizU");
 
  multiplicacion(matriz, matrizU, matrizMult, FA, FB, CA, CB);
  mostrar_matriz(matrizMult, orden);
 
  getchar();
  getchar();
  return 0;
}
//Funcion que muestra la matriz introducida por teclado
//Esto se desarrolla mediante un bucles que va recorriendo las filas y columnas
//de la matriz y va imprimiendo los datos de cada posicion
void mostrar_matriz(double matriz[][MAX], int orden)
{
int i, j; //Variables usadas para bucles

printf("Orden: %d\n", orden);
  for (i = 0; i < orden; i++) { //Recorre las filas
     for (j = 0; j < orden; j++) {//Recorre las columnas
      printf("\t%.1lf", matriz[i][j]);
     }
     printf("\n"); //Salto de linea cada vez que recorre todas las columnas de una fila
  }
}
//Esta funcion realiza el calculo que se almacena en una matriz llamada matrizU
//Esta matriz es como una matriz triangular superior pero al contrario y con simbolos negativos
//                  | 1 0 2 |                | 0 0 -2 |
//  matriz normal:  | 3 4 1 |     matriz U:  | 0 0 -1 |
//                  | 8 6 9 |                | 0 0  0 |
void mostrar_gaussU(double matriz[][MAX], int orden, double matrizU[MAX][MAX]){

  int i, j; //Variables usadas para bucles
  printf("\nMatriz U\n");
  printf("\n");
   for (i = 0; i < orden; i++) //recorre las filas
   {
       for (j = 0; j < orden; j++) //recorre las columnas
       {
           if (i > j) //guarda valores 0 ya estos valores son los que estan por debajo de la diagonal principal
           {
               printf("\t0");
               matrizU[i][j] = matriz[i][j];
           }else if(i == j){ //guarda valores 0 ya que estos valores son los de la diagonal principal
               printf("\t0");
               matrizU[i][j] = matriz[i][j];
           }
           else{ //los valores son los que estan por debajo de la diagonal principal
              //compruebo el signo del numero
           if(matriz[i][j]<0){
              printf("\t%d", abs(matriz[i][j])); //abs se utiliza para sacar el valor absoluto
              matrizU[i][j] = matriz[i][j];
           }else{
              printf("\t%d", ((matriz[i][j]*0)-matriz[i][j])); //multiplico el valor por 0 y resto el propio valor para que sea negativo
              matrizU[i][j] = matriz[i][j];
           }
           }
       }
       printf("\n");
   }
}
//Esta funcion realiza el calculo que se almacena en una matriz llamada matrizL
//Esta matriz es como una matriz triangular inferior pero al contrario y con simbolos negativos
//                  | 1 0 2 |                |  0  0 0 |
//  matriz normal:  | 3 4 1 |     matriz L:  | -3  0 0 |
//                  | 8 6 9 |                | -8 -6 0 |

//Funcion la cual realiza una multiplicacion entre 2 matrices,
//en este caso la realiza entre la matriz inversa y la matriz U,
//este resultado se almacena en la variable matrizMult
void multiplicacion(double identidad[][MAX], double matrizU[][MAX], double matrizMult[][MAX], int FA, int FB, int CA, int CB){
  int i, j, k;  //Variables usadas para bucles
   
  for (i = 0 ; i < FA ; i++){ //recorre las filas
   for (j = 0 ; j < CB ; j++){ //recorre las columnas
       matrizMult[i][j]=0;//establece la posicion a cero
        for (k = 0 ; k < CA ; k++){
         matrizMult[i][j] = matrizMult[i][j]+identidad[i][k]*matrizU[k][j];//va modificando la matriz mientras multiplica la matriz
         }
      }
   }
}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)