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;
}
}
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í:
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];
}
}
}
Yo "creo" que más bien:
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
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[ i ][ j ] = 0 ;
No le veo la utilidad creo que es innecesario
Cita de: kutcher en 7 Agosto 2014, 17:08 PM
Lo de & es verdad, pero el:
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:
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
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
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.
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
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.
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/simba2.gif)
MUCHAS GRACIAS :) ya me multiplica las matrices perfectas xDD