Multiplicacion de matrices Anxk y Bkxm

Iniciado por chicainge, 7 Agosto 2014, 14:40 PM

0 Miembros y 4 Visitantes están viendo este tema.

chicainge

Tengo un pequeño problema al almacenar la matriz o al calcular el resultado en el subalgoritmo MulMatrizAB(...), podrian ayudarme ha encontrar el problema?? Graciass  :D
El enunciado decia lo siguiente:
Hacer un subalgoritmo que calcule el producto de dos matrices ANxK x B KxM, y lo
almacene en una matriz CNxM.
Aqui les dejo mi codigo:

#include<iostream>

using namespace std;

const int N=2;
const int M=3;
const int K=2;

typedef int MatrizA[N][K];
typedef int MatrizB[K][M];
typedef int MatrizC[N][M];

void mostarResul(MatrizC );
void MulMatrizAB(MatrizA ,MatrizB ,MatrizC &);


int main(){
MatrizA A;
MatrizB B;
MatrizC C;

cout<<"Introduce una matriz A 2x2, por filas " ;
for(int i=0;i<N;i++){
   for(int j=0;j<K; j++){
     cin>>A[i][j];
   }
}
cout<<"introduce una matriz B 2x3, por filas " ;
for(int i=0;i<K;i++){
   for(int j=0;j<M; j++){
     cin>>B[i][j];
     C[i][j]=0;
   }
}
MulMatrizAB(A,B,C);
mostarResul(C);
}
void MulMatrizAB(MatrizA a,MatrizB b,MatrizC &c){
   int z=0;
   for(int i=0 ; i<N ; i++){
     for(int j=0 ; j<M ; j++){
       for(int h=0 ; h<K ; h++){
         z=(a[i][h]*b[h][j])+z;
         if(h==1){
          c[j][i]=z;
          z=0;
         }
       }
     }
   }
}
void mostarResul(MatrizC c){
for(int i=0; i<N ; i++){
   for(int j=0; j<M ;j++){
    cout<<c[i][j]<<"  ";
   }
   cout<<endl;
}
}


kutcher

Cita de: chicainge en  7 Agosto 2014, 14:40 PM
Tengo un pequeño problema al almacenar la matriz o al calcular el resultado en el subalgoritmo MulMatrizAB(...), podrian ayudarme ha encontrar el problema??

Creo que debería quedar algo así:

Código (cpp) [Seleccionar]
void MulMatrizAB( MatrizA a, MatrizB b, MatrizC &c )
{
    for(int i = 0 ; i < N ; i++){
        for(int j = 0 ; j < M ; j++){
            for(int h = 0 ; h < K ; h++)
                c[i][j] += a[i][h] * b[h][j];
        }
    }
}


leosansan

#2
Yo "creo" que más bien:

Código (cpp) [Seleccionar]
 void MulMatrizAB ( MatrizA a , MatrizB b , MatrizC c ) {
  for ( int i = 0 ; i < N ; i++ )
    for ( int j = 0 ; j < M ; j++ ) {
      c[ i ][ j ] = 0 ;
      for ( int h = 0 ; h < K ; h++ )
        c[ i ][ j ] += ( a[ i ][ h ] * b[ h ][ j ] ) ;
    }
}


Sobra el operador & de c.

¡¡¡¡ Saluditos! ..... !!!!



kutcher

Cita de: leosansan en  7 Agosto 2014, 16:49 PM
Yo "creo" que más bien:
Sobra el operador "&" con la variable c.

Lo de & es verdad, pero el:

Código (cpp) [Seleccionar]
c[ i ][ j ] = 0 ;

No le veo la utilidad creo que es innecesario

leosansan

Cita de: kutcher en  7 Agosto 2014, 17:08 PM
Lo de & es verdad, pero el:

Código (cpp) [Seleccionar]
c[ i ][ j ] = 0 ;

No le veo la utilidad creo que es innecesario


Como es una variable acumulador si no está inicializada, "creo, ¡eh!", puede contener basura a la que se irían añadiendo los valores que va sumando.

Lo veo como hacer:

Código (cpp) [Seleccionar]
  int num ;
  num += 5 ;
  printf ( "%d" , num ) ;


Como num no está inicializado su valor es impredecible, aunque hay algunos compiladores que por defecto inician las variables a cero, y al sumar 5 el resultado es "rarito".

¡¡¡¡ Saluditos! ..... !!!!



kutcher

Cita de: leosansan en  7 Agosto 2014, 17:16 PM
Como es una variable acumulador si no está inicializada, "creo, ¡eh!", puede contener basura a la que se irían añadiendo los valores que va sumando.

Ya se habia inicializado previamente todos sus elementos a cero en el main   

eferion

Cita de: kutcher en  7 Agosto 2014, 17:36 PM
Ya se habia inicializado previamente todos sus elementos a cero en el main  

Se inicializa... pero mal. Fíjate que se aprovecha la inicialización de B... si cambias los datos y haces que A deje de ser cuadrada tienes un problema.

kutcher

Cita de: eferion en  7 Agosto 2014, 18:06 PM
Se inicializa... pero mal. Fíjate que se aprovecha la inicialización de B... si cambias los datos y haces que A deje de ser cuadrada tienes un problema.

Entiendo.. pero eso seria otro caso, es de esperar que se harían las modificaciones
convenientes   

ivancea96

Es curioso, pero todos tenéis razón :D

En cualquier caso, hacer 3 typedef para 3 matrices no me parece para nada acertado.
1: el tamaño de C se saca del tamaño de A y B.
2: si quieres multiplicar dos matrices en orden contrario, tendrías que cambiarles el 'tipo' de MatrizA a MatrizB y etc.

Lo normal sería hacer una clase para matriz, o simplemente olvidar los typedef.

leosansan

Cita de: kutcher en  7 Agosto 2014, 17:36 PM
Ya se habia inicializado previamente todos sus elementos a cero en el main   

Cierto, ni había mirado la función main. Sorry¡.

Y totalmente de auerdo con lo expuesto por ivancea96 y eferion.

¡¡¡¡ Saluditos! ..... !!!!