Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chicainge en 7 Agosto 2014, 14:40 pm



Título: Multiplicacion de matrices Anxk y Bkxm
Publicado por: 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?? 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:

Código:
#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;
 }
}


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: kutcher en 7 Agosto 2014, 16:34 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
  1. void MulMatrizAB( MatrizA a, MatrizB b, MatrizC &c )
  2. {
  3.    for(int i = 0 ; i < N ; i++){
  4.        for(int j = 0 ; j < M ; j++){
  5.            for(int h = 0 ; h < K ; h++)
  6.                c[i][j] += a[i][h] * b[h][j];
  7.        }
  8.    }
  9. }


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: leosansan en 7 Agosto 2014, 16:49 pm
Yo "creo" que más bien:

Código
  1.  void MulMatrizAB ( MatrizA a , MatrizB b , MatrizC c ) {
  2.   for ( int i = 0 ; i < N ; i++ )
  3.     for ( int j = 0 ; j < M ; j++ ) {
  4.       c[ i ][ j ] = 0 ;
  5.       for ( int h = 0 ; h < K ; h++ )
  6.         c[ i ][ j ] += ( a[ i ][ h ] * b[ h ][ j ] ) ;
  7.     }
  8. }

Sobra el operador & de c.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: kutcher en 7 Agosto 2014, 17:08 pm
Yo "creo" que más bien:
Sobra el operador "&" con la variable c.

Lo de & es verdad, pero el:

Código
  1. c[ i ][ j ] = 0 ;

No le veo la utilidad creo que es innecesario


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: leosansan en 7 Agosto 2014, 17:16 pm
Lo de & es verdad, pero el:

Código
  1. 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
  1.  int num ;
  2.  num += 5 ;
  3.  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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: kutcher en 7 Agosto 2014, 17:36 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   


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: eferion en 7 Agosto 2014, 18:06 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.


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: kutcher en 7 Agosto 2014, 18:31 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   


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: ivancea96 en 7 Agosto 2014, 18:56 pm
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.


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: leosansan en 7 Agosto 2014, 18:59 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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/simba2.gif)


Título: Re: Multiplicacion de matrices Anxk y Bkxm
Publicado por: chicainge en 8 Agosto 2014, 13:55 pm
MUCHAS GRACIAS :) ya me multiplica las matrices perfectas xDD