Programa que multiplica matrices C

Hola, vereis, estoy liadisimo haciendo esta práctica. No sé por qué no me funciona...
Alguna sugerencia??
Gracias!!
#include <stdio.h>
#include <stdlib.h>
#define MAXFILS 10
#define MAXCOLS 10

void main()
{
int A[MAXFILS][MAXCOLS], B[MAXFILS][MAXCOLS], C[MAXFILS][MAXCOLS];
int M, N, P, Q;

int leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],
int M, int N);

printf("Introduzca el valor de  M y N de la matriz A\n");
scanf("%d %d",&M, &N);
printf ("Introduzca la matriz A\n");
leerMatriz(A,M,N);
printf("Matriz A\n");
visualMatriz(A,M,N);

printf("\nIntroduzca el valor de P y Q de la matriz B\n");
scanf("%d %d",&P, &Q);
printf("\nIntroduzca la matriz B\n");
leerMatriz(B,P,Q);
printf("Matriz B\n");
visualMatriz(B,P,Q);

productMatriz(A,B,C, M,Q);

printf ("\nEl resultado es:\n");
visualMatriz(C,M,Q);
getch();
}


void leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
   int i, j;
   for(i=0; i< M ; i++){
         for ( j=0; j < N; j++){
            scanf("%d",&arr[i][j]);
         }
      }
   }


void visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
   int i, j;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         printf("%d",arr[i][j]);
         }
      }
   }

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[i][k] * B[k][j];
         }
      }
   }
}

PiraBeLiO escribió:Hola, vereis, estoy liadisimo haciendo esta práctica. No sé por qué no me funciona...
Alguna sugerencia??
Gracias!!
#include <stdio.h>
#include <stdlib.h>
#define MAXFILS 10
#define MAXCOLS 10

void main()
{
int A[MAXFILS][MAXCOLS], B[MAXFILS][MAXCOLS], C[MAXFILS][MAXCOLS];
int M, N, P, Q;

int leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N);
int productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],
int M, int N);

printf("Introduzca el valor de  M y N de la matriz A\n");
scanf("%d %d",&M, &N);
printf ("Introduzca la matriz A\n");
leerMatriz(A,M,N);
printf("Matriz A\n");
visualMatriz(A,M,N);

printf("\nIntroduzca el valor de P y Q de la matriz B\n");
scanf("%d %d",&P, &Q);
printf("\nIntroduzca la matriz B\n");
leerMatriz(B,P,Q);
printf("Matriz B\n");
visualMatriz(B,P,Q);

productMatriz(A,B,C, M,Q);

printf ("\nEl resultado es:\n");
visualMatriz(C,M,Q);
getch();
}


void leerMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
   int i, j;
   for(i=0; i< M ; i++){
         for ( j=0; j < N; j++){
            scanf("%d",&arr[i][j]);
         }
      }
   }


void visualMatriz(int arr[MAXFILS][MAXCOLS], int M, int N){
   int i, j;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         printf("%d",arr[i][j]);
         }
      }
   }

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[i][k] * B[k][j];
         }
      }
   }
}



Primero, dinos qué tipo de error es, si en tiempo de ejecución o de compilación, ya que sólo mirando la definición de main veo que no te ciñes al standard ANSI.

Rojos saludos.

Edit: Aún así, se ve a simple vista que no controlas el tamaño de las matrices que multiplicas, sólo de la final, por tanto imagino que sucederá algo como esto:

- Si multiplicas una matriz MxN por otra PxQ, si N<Q o M>P multiplicas y restas elementos de matrices que en los que sólo has reservado memoria, imagino que ese será tu fallo.

Rojos saludos.
Es en tiempo de ejecución, el programa se ejecuta perfectamente, pero el valor de la matriz resultado no tiene sentido.
Te refieres a que en la función de multiplicación me falta un bucle con los tamaños de las matrices para hacer la operación??


Gracias!!
PiraBeLiO escribió:Es en tiempo de ejecución, el programa se ejecuta perfectamente, pero el valor de la matriz resultado no tiene sentido.
Te refieres a que en la función de multiplicación me falta un bucle con los tamaños de las matrices para hacer la operación??

Gracias!!


Vamos a ver, mira este bucle:

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[i][k] * B[k][j];
         }
      }
   }
}


Si multiplicas una matriz A(MxN) y otra B(PXQ), el resultado es una C(MXQ). Pues bien, en caso de que M > P o que Q > N (o ambas a la vez), fíjate en qué pasaría en tu bucle, creo que está ahí el fallo, a simple vista, vamos.

Rojos saludos.
paliyoes escribió:
PiraBeLiO escribió:Es en tiempo de ejecución, el programa se ejecuta perfectamente, pero el valor de la matriz resultado no tiene sentido.
Te refieres a que en la función de multiplicación me falta un bucle con los tamaños de las matrices para hacer la operación??

Gracias!!


Vamos a ver, mira este bucle:

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[i][k] * B[k][j];
         }
      }
   }
}


Si multiplicas una matriz A(MxN) y otra B(PXQ), el resultado es una C(MXQ). Pues bien, en caso de que M > P o que Q > N (o ambas a la vez), fíjate en qué pasaría en tu bucle, creo que está ahí el fallo, a simple vista, vamos.

Rojos saludos.


Pero en realidad sólo fallaría si introdujese mal los parámetros de las matrices, en el caso de que los introdujese bien debería funcionar no?? Porque aunque en la función multiplicar se vean los parámetros M y N, los que se le pasa en realidad son M y Q.

Gracias por la ayuda!
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }
      }
   }
}


He cambiado los índices de A y B de A[i][k] * B[k][j] a A[j][k] * B[k][i].

Creo que es eso, pero no tengo ganas de comprobarlo :P
Wizard 5 escribió:
void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < N; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }
      }
   }
}


He cambiado los índices de A y B de A[i][k] * B[k][j] a A[j][k] * B[k][i].

Creo que es eso, pero no tengo ganas de comprobarlo :P


Nada... pero gracias!
Ejecuta paso a paso...
PiraBeLiO escribió:Pero en realidad sólo fallaría si introdujese mal los parámetros de las matrices, en el caso de que los introdujese bien debería funcionar no?? Porque aunque en la función multiplicar se vean los parámetros M y N, los que se le pasa en realidad son M y Q.

Gracias por la ayuda!


No, me refiero a que tu programa funcionara bien sólo para matrices cuadradas.

Rojos saludos.
Rugal_kof94 escribió:Ejecuta paso a paso...

Sip, hazlo en papel y con calma. Un par de matrices pequeñas.

Lo que he puesto antes está mal, estaba haciéndolo con dos matrices 2X2 y he cambiado la posición de un par de resultados no sé exactamente por qué.
Necesitas pasar tres parámetros al programa de multiplicación.

Si multiplicas una matriz A(m x n) por una matriz B(n x p) te dará una matriz C(m x p)

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N, int P){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < P; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }
      }
   }
}


Así debería funcionar si multiplicas A(m x p) por B(p x n).
Zespris escribió:Necesitas pasar tres parámetros al programa de multiplicación.

Si multiplicas una matriz A(m x n) por una matriz B(n x p) te dará una matriz C(m x p)

void productMatriz(int A[MAXFILS][MAXCOLS], int B[MAXFILS][MAXCOLS], int C[MAXFILS][MAXCOLS],int M, int N, int P){
   int i, j, k;
   for(i=0; i< M ; i++){
      for ( j=0; j < N; j++){
         C[i][j] = 0 ;
         for (k=0; k < P; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }
      }
   }
}


Así debería funcionar si multiplicas A(m x p) por B(p x n).



Nada!!! Me estoy volviendo loco, y mira que no es complicado!
Ten en cuenta que tu tienes dos matrices...

A(m,n) y B(p,q).

Sólo las puedes multiplicar si n=p, y te da una matriz C(m,q), hasta ahí bien?

Pues entonces, el elemento i,j de la matriz C viene dado por:

C(i,j) = SUMA (k=1,p) A(i,k)*B(k,j)...

que sería el bucle interno:

C[i][j] = 0 ;
         for (k=0; k < P; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }


El resto de bucles es para ir pasando por todos los i,j elementos de C.

Entonces, necesitas pasarle p al programa, para que sepa cuantos elementos contar.

Si A fuera (3x2) y B (2x4), C sería (3x4).

C(1,2) sería A(1,1)*B(1,2)+A(1,2)*B(2,2).

Pero si A fuera (3x4) y B (4x4), C también sería (3x4). Aun así, el algoritmo de multiplicación sería diferente, ya que tendrías que sumar 4 productos para calcular cada elemento de C.

C(1,2) ahora sería sería A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(4,2).

Ahora?
Zespris escribió:Ten en cuenta que tu tienes dos matrices...

A(m,n) y B(p,q).

Sólo las puedes multiplicar si n=p, y te da una matriz C(m,q), hasta ahí bien?

Pues entonces, el elemento i,j de la matriz C viene dado por:

C(i,j) = SUMA (k=1,p) A(i,k)*B(k,j)...

que sería el bucle interno:

C[i][j] = 0 ;
         for (k=0; k < P; k++){
            C[i][j] = C[i][j] + A[j][k] * B[k][i];
         }


El resto de bucles es para ir pasando por todos los i,j elementos de C.

Entonces, necesitas pasarle p al programa, para que sepa cuantos elementos contar.

Si A fuera (3x2) y B (2x4), C sería (3x4).

C(1,2) sería A(1,1)*B(1,2)+A(1,2)*B(2,2).

Pero si A fuera (3x4) y B (4x4), C también sería (3x4). Aun así, el algoritmo de multiplicación sería diferente, ya que tendrías que sumar 4 productos para calcular cada elemento de C.

C(1,2) ahora sería sería A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(4,2).

Ahora?


Creo que si, voy a revisar los bucles externos.
13 respuestas