PDA

Visualizza la versione completa : [C] prodotto fra matrici.


mariella_88
24-05-2014, 19:54
Salve gente,
ho un problema con un prodotto tra matrici, non so perché, la sintassi è giusta (il compilatore non mi da nessun errore) però il risultato è errato!
Facendo delle ricerche su internet, ho notato che gli indici utilizzati sono quelli che ho utilizzato io..
Nel codice che posto c'è anche una funziona che calcola la trasposta poiché il programma sarebbe calcolare il prodotto tra la trasposta(A)*A.
Ho già testato il codice riguardante il calcolo della trasposta e funziona correttamente.. Inoltre se le due matrici non sono quadrate il prodotto non funziona proprio, il programma non funziona proprio.

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


void trasposta(int **trasp, int **matrice, int righe, int colonne);
void moltiplicazione(int **ris, int **trasp, int **matrice, int righe,
int colonne);


int main(void) {
int righe, colonne, i, j;
int **matrice;
int **trasp;
int **ris;


printf(" Righe........: ");
fflush(stdout);
scanf("%d", &righe);
printf(" Colonne......: ");
fflush(stdout);
scanf("%d", &colonne);
puts("");


matrice = (int**) malloc((righe * sizeof(int*)));
trasp = (int**) malloc((colonne * sizeof(int*)));
ris = (int**) malloc((righe * sizeof(int*)));


for (i = 0; i < righe; i++) {
matrice[i] = (int*) malloc(colonne * sizeof(int));
}


for (i = 0; i < righe; i++) {
ris[i] = (int*) malloc(colonne * sizeof(int));
}


for (i = 0; i < colonne; i++) //poichè la matrice trasposta ha num righe e colonne invertire
{
trasp[i] = (int*) malloc(righe * sizeof(int));
}


for (i = 0; i < righe; ++i) {
for (j = 0; j < colonne; ++j) {
printf("Inserisci elemento riga %d e colonna %d: ", i, j);
fflush(stdout);
scanf("%d", &matrice[i][j]);
printf("\n");
fflush(stdout);
}
}


for (i = 0; i < colonne; ++i) {
for (j = 0; j < righe; ++j) {
trasp[i][j] = 0;
}
}


for (i = 0; i < righe; ++i) {
for (j = 0; j < colonne; ++j) {
ris[i][j] = 0;
}
}


trasposta(trasp, matrice, righe, colonne);
moltiplicazione(ris, matrice, trasp, righe, colonne);


for (i = 0; i < righe; ++i) {
for (j = 0; j < colonne; ++j) {
printf("matrice[%d][%d]= %d ", i, j, matrice[i][j]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
}


for (i = 0; i < colonne; ++i) {
for (j = 0; j < righe; ++j) {
printf("trasp[%d][%d]= %d ", i, j, trasp[i][j]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
}


for (i = 0; i < colonne; ++i) {
for (j = 0; j < righe; ++j) {
printf("ris[%d][%d]= %d ", i, j, ris[i][j]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
}


return 0;
}


void trasposta(int **trasp, int **matrice, int righe, int colonne) {
int i, j; /*Dichiaro la variabile temporanea per lo scambio*/
for (i = 0; i < colonne; i++) {
for (j = 0; j < righe; j++) {


trasp[i][j] = matrice[j][i];
}
}
}


void moltiplicazione(int **ris, int **trasp, int **matrice, int righe,
int colonne) {
int i, j, k;
int tmp = 0;
for (i = 0; i < righe; i++) {
for (j = 0; j < colonne; j++) {
for (k = 0; k < righe; k++) {
tmp += matrice[i][k] * trasp[k][j];
printf("variabile temporanea %d", tmp);
fflush(stdout);
printf("\n");
fflush(stdout);
}
ris[i][j] = tmp;
//tmp=0;


}
}
}

Ecco il risultato stampato a video:
Righe........: 2
Colonne......: 2


Inserisci elemento riga 0 e colonna 0: 1


Inserisci elemento riga 0 e colonna 1: 2


Inserisci elemento riga 1 e colonna 0: 1


Inserisci elemento riga 1 e colonna 1: 2


variabile temporanea 1
variabile temporanea 2
variabile temporanea 4
variabile temporanea 6
variabile temporanea 8
variabile temporanea 10
variabile temporanea 14
variabile temporanea 18
matrice[0][0]= 1 matrice[0][1]= 2
matrice[1][0]= 1 matrice[1][1]= 2
trasp[0][0]= 1 trasp[0][1]= 1
trasp[1][0]= 2 trasp[1][1]= 2
ris[0][0]= 2 ris[0][1]= 6
ris[1][0]= 10 ris[1][1]= 18


Ho provato anche a stampare il valore progressivo della variabile tmp, ma ha dei valori completamente sballati :confused::confused::confused::confused::confused: :confused:

oregon
24-05-2014, 20:02
Mi sa che manca un

tmp=0;

dopo il secondo for

mariella_88
24-05-2014, 20:07
Non va lo stesso :(
Se vedi nel codice avevo azzerato tmp alla fine del calcolo, ho provato in quel modo, senza (per questo è rimasto commentato) e adesso ho provato come hai detto tu, a metterlo tra il for fi j e il for di k.. Però mi da sempre risultato errato!!

oregon
24-05-2014, 20:09
Quale risultato ti dà adesso? Quale dovrebbe essere?

mariella_88
24-05-2014, 20:37
quello che mi da:
ris[0][0]= 2 ris[0][1]= 4
ris[1][0]= 4 ris[1][1]= 8
quello che dovrebbe essere:
ris[0][0]= 5 ris[0][1]= 5
ris[1][0]= 5 ris[1][1]= 5

mariella_88
24-05-2014, 20:48
quello che mi da:
ris[0][0]= 2 ris[0][1]= 4
ris[1][0]= 4 ris[1][1]= 8
quello che dovrebbe essere:
ris[0][0]= 5 ris[0][1]= 5
ris[1][0]= 5 ris[1][1]= 5

oregon
24-05-2014, 21:06
Quando hai chiamato la funzione moltiplicazione hai invertito due parametri. Devono essere

moltiplicazione(ris, trasp, matrice, righe, colonne);

mariella_88
24-05-2014, 21:13
Perfetto.. Il risultato adesso è giusto, solo che se le matrici non sono quadrate non funziona (invece dovrebbe funzionare correttamente)

oregon
24-05-2014, 21:42
Ad esempio, con quale matrice? E con quali risultati?

mariella_88
25-05-2014, 12:28
Mi da proprio errore, non mostra nessun risultato.. E' un errore di segmentazione (non aggiunge altri dettagli :() io penso sia un errore di indici nel triplo for innestato, ma non riesco a trovare la configurazione giusta! :(

Loading