Producto de matrices C

nomechordas

He estado probando con matrices 3x3 y por algún motivo las posiciones 2,3 y 3,1 dan números muy grandes y no logro ver el error.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hallardimensiones(char archivo[20],char matrizt[20][20],int *filas,int *col){
     FILE *file;
     file = fopen(archivo,"r");
     if (file == NULL){
              perror("error al abrir el fichero");
              system("pause");
              return;
              }
     int i,elementos;
     float aux;
     for ( i=0;!(feof(file));i++){
        
fgets(matrizt[i],100,file); } fclose(file); *filas = i; file = fopen(archivo,"r"); for ( i=1; fscanf(file," %f",&aux)==1;i++){ } elementos = i; *col = elementos/(*filas); printf("Hay %i filas y %i columnas",(*filas),(*col)); fclose(file); }
void leer(char archivo[],int filas,int col,float matriz[filas][col]){ FILE *file; file = fopen(archivo,"r");
int i,j; for(i=0,j=0;i<filas;i++){ for(j=0;j<col;j++){ printf("posicion %i %i \n",i,j); fscanf(file," %f",&matriz[i][j]); } } for(i=0,j=0;i<filas;i++){ for(j=0;j<col;j++){ printf(" %f ",matriz[i][j]); } printf(" \n"); } fclose(file); } producto(int filas1,int filas2,int col1,int col2,float matriz1[filas1][col1],float matriz2[filas2][col2],float resultado[filas1][col2]){ int i,j,z;
if (filas1!=col2){ printf("error de dimensiones");
system("pause"); return; }
for(i=0,j=0;i<filas1;i++){ for(j=0;j<col2;j++){ for(z=0;z<filas1;z++){ resultado[i][j]+=(matriz1[i][z])* (matriz2[z][j]); } } } for(i=0,j=0;i<filas1;i++){ printf(" \n"); for(j=0;j<col2;j++){ printf(" %.2f",resultado[i][j]); }
} printf(" \n"); }

int main(){ char archivo[20]; char matrizt[20][20];
printf("Introduce el nombre del archivo de la matriz 1 \n"); gets(archivo); int filas1,col1; hallardimensiones(archivo,matrizt,&filas1,&col1); float matriz1[filas1][col1]; leer(archivo,filas1,col1,matriz1); printf("Introduce el nombre del archivo la matriz 2\n"); gets(archivo); int filas2,col2; hallardimensiones(archivo,matrizt,&filas2,&col2); float matriz2[filas2][col2]; leer(archivo,filas2,col2,matriz2); float resultado[filas1][col2]; producto(filas1,filas2,col1,col2,matriz1,matriz2,resultado); system("pause"); return 0;
}

Matrices que he multiplicado para probar:

1 1 1
2 3 2
4 5 6
1 0 0
0 1 0
0 0 0

PD:Si hace falta meto comentarios xD

1
Lecherito

Te aconsejo dos cosas:
1- que pongas el trozo de código que realmente te da problemas
2- quites unos cuantos tabuladores y lo dejes bien puesto por que es bastante dificil de averiguar.

Para 1:
1- Ver si te lee bien las matrices
2- Ver si se pasan bien a los métodos etc

PD: Para los métodos usa int* array; no sé los demás pero odio ver int array[20] xDD

1 respuesta
nomechordas

#2 Sí ha quedado tabulado un poco mal al postearlo xD

for(i=0,j=0;i<filas1;i++){
              for(j=0;j<col2;j++){
                       for(z=0;z<filas1;z++){
                                    resultado[i][j]+=(matriz1[i][z])* (matriz2[z][j]);
                                     }
                }
}


EJ:Multiplico la matriz

1 2 3
4 5 6
7 8 9

por la identidad y me da esto,cuando debería quedar ella misma.Con matrices 2x2 parece que funciona.

Respecto a int *array y demás nos han enseñado a hacerlo de una forma nada más xD

1 respuesta
ziordo

#3 has probado a multiplicarlo por otra cosa que no sea la identidad?

y has probado a multiplicarlo por otra cosa que no sea la identidad en 2x2?

1 respuesta
nomechordas

#4 Pasa lo mismo en 3x3 si no es la identidad, en 2x2 supongo que siga funcionando xD

1 respuesta
ziordo

#5 lo del + de antes del igual es un sumatorio?
#7 ok, es que yo soy de c++ y hay cosas distintas

1 respuesta
nomechordas

#6 var += 1; equivale a var = var +1;
Osea que sí.

2 respuestas
Lecherito

#7 Inicializas el array de resultados a 0?

http://ideone.com/JX92De

1 respuesta
nomechordas

#8 joder gracias,creo que va a ser eso, lo curioso es que en algunas posiciones funciona y en otras no.

1 respuesta
Lecherito

#9 Depende de la mierda que haya por ahí, a saber.

1 respuesta
nomechordas

#10 Parece que ya funciona xD, si me llega a salir cosas raras en todas las posiciones me habría dado cuenta seguramente.
Muchas gracias.

1 respuesta
Lecherito

#11 Siempre inicializa nen, INICIALIZA!

2

Usuarios habituales

  • Lecherito
  • nomechordas
  • ziordo