[C] Prodotto tra matrici

Messaggioda Nicole29 » 02/05/2018, 17:57

Buonasera, sto creando un programma che chiede all'utente di inserire due matrici e ne calcoli il prodotto.
Fin quando inserisco le matrici tutto ok, ma ho qualche problema sul punto in cui calcola il prodotto perché il risultato (qualunque siano le matrici) è sempre la matrice nulla. Qualcuno può dirmi dove sbaglio?
Non ho mai programmato fino ad ora e lo sto facendo perchè ho l'esame di informatica quindi ho qualche difficolta.. Ecco il mio codice

#include <stdio.h>
#include <stdlib.h>
#define maxrighe 100
#define maxcolonne 100

int main () {
int i, j, righea, colonnea;
int r, c, righeb, colonneb;
int a[maxrighe][maxcolonne];
int b[maxrighe][maxcolonne];
int pr[maxrighe][maxcolonne];
int m, t, h;


printf ("Inserisci il numero di righe e di colonne di A\n");
scanf ("%i%i", &righea, &colonnea);

printf ("Inserisci il numero di righe e di colonne di B\n");
scanf ("%i%i", &righeb, &colonneb);

if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}

else {

printf ("Inserisci gli elementi della matrice A\n");
for ( i = 0; i < righea; i++) {
for (j = 0; j < colonnea; j++){
scanf ("%i", &a[i][j]);
}}


printf ("La matrice A e':\n");
for (i = 0; i < righea; i++){
for (j = 0; j < colonnea; j++) {
printf ("%2i", a[i][j]);
}
printf ("\n");
}

printf (" Inserisci gli elementi della matrice B\n");
for ( r = 0; r < righeb; r++){
for ( c = 0; c < colonneb; c++) {
scanf ("%i", &b[r][c]);
}}

printf ("La matrice B e':\n");
for (r = 0; r < righeb; r++){
for (c = 0; c < colonneb; c++) {
printf ("%2i", b[r][c]);
}
printf ("\n");
}

printf ("Il prodotto di A e B e' C = \n");

pr[maxrighe][maxcolonne] = pr[righea][colonneb];
for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++) {
a[m][t] = 0;
};

for ( m = 0; m < righea; m++)
for ( t = 0; t < colonneb; t++)
for ( h = 0; h < colonnea; h++) {
pr[m][t] += a[i][j] * b[r][c];


}

for (m = 0; m < righea; m++) {
for ( t = 0; t < colonneb; t++) {
printf ("%2i", pr[m][t]);
}
printf ("\n");
}




}
return 0;

}
Nicole29
Junior Member
Junior Member
 
Messaggio: 43 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Prodotto tra matrici

Messaggioda apatriarca » 02/05/2018, 19:19

Immagino che nei cicli precedenti al calcolo del prodotto volessi inizializzare pr e non settare tutti i valori della matrice a a zero.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5043 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Prodotto tra matrici

Messaggioda Nicole29 » 02/05/2018, 20:24

si.. ma ho sbagliato qualcosa
Nicole29
Junior Member
Junior Member
 
Messaggio: 44 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Prodotto tra matrici

Messaggioda niccoset » 02/05/2018, 20:38

Le righe sbagliate sono fondamentalmente due e riguardano il calcolo della matrice $ C = AB $, in particolare è sbagliata l'inizializazione ( come già detto da apatriarca) e il calcolo di pr[m][t]
Ecco una possibile soluzione:
Codice:
        for ( m = 0; m < righea; m++){
            for ( t = 0; t < colonneb; t++){
                pr[m][t] = 0;
                for ( h = 0; h < colonnea; h++) {
                    pr[m][t] += a[m][h] * b[h][t];
                }
            }
        }
" Tutto dovrebbe essere reso più semplice possibile, ma non più semplice ancora. " - Albert Einstein
niccoset
Average Member
Average Member
 
Messaggio: 255 di 584
Iscritto il: 13/06/2013, 07:17

Re: [C] Prodotto tra matrici

Messaggioda Obidream » 02/05/2018, 22:06

Poi non dovrebbe essere:

Codice:
if(colonne_a != righe_b)
    {
        printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
    }


Tra l'altro è possibile fare una cosa del genere per inizializzare a 0 la matrice prodotto:

Codice:
int pr[MAX_RIGHE][MAX_COLONNE] = { 0 }; 
((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))
Avatar utente
Obidream
Advanced Member
Advanced Member
 
Messaggio: 903 di 2195
Iscritto il: 07/02/2012, 20:57

Re: [C] Prodotto tra matrici

Messaggioda Nicole29 » 02/05/2018, 22:51

Per niccoset : Grazie adesso funziona bene! :D
Per Obidream: nel codice avevo scritto
if (righea != colonneb) {
printf ("Errore: Il numero di righe di A deve essere uguale al numero di colonne di B\n");
}
Grazie per l'alternativa che mi hai proposto comunque
Nicole29
Junior Member
Junior Member
 
Messaggio: 45 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Prodotto tra matrici

Messaggioda Super Squirrel » 03/05/2018, 00:21

Codice:
printf("Il prodotto di A e B e' C = \n");

Dalla precedente riga di codice presumo che C=A*B, giusto?
Se è così e se stiamo parlando di prodotto riga-colonna, allora quanto detto da Obidream (mi riferisco alla condizione dell'if e non al messaggio della printf che andrebbe invece corretto) non è un'alternativa, ma il modo corretto di impostare il programma. Il prodotto riga-colonna tra due matrici non è commutativo e affinché l'operazione A*B sia possibile, le colonne di A devono essere uguali alle righe di B.

Cosa stai cercando di fare con la seguente riga di codice?
Codice:
pr[maxrighe][maxcolonne] = pr[righea][colonneb];


Un paio di considerazioni:
- stai usando molte più variabili di quelle effettivamente necessarie per svolgere l'esercizio;
- una volta definite maxrighe e maxcolonne dovresti controllare che i valori inseriti dall'utente siano <= 100.

Per niccoset : Grazie adesso funziona bene! :D

In base alle considerazioni appena fatte ho i miei dubbi al riguardo, magari posta il codice aggiornato.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 194 di 1486
Iscritto il: 16/05/2013, 22:05


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite