PDA

Visualizza la versione completa : [c] Prodotto righe per colonne


Eduadie
07-06-2013, 15:15
Ho una function che dovrebbe calcolarmi il prodotto righe per colonne ma effettivamente i risultati dell'ultima riga quando le due matrici hanno dimensioni diverse non sono quelli giusti...
Dove potrebbe essere l'errore? Sono sicuro che si trovi nella function...



void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p)
{
int i, j, k;

for(i=0;i<m;i++)
{
printf("\t");
for(j=0;j<n; j++)
{
for(k=0;k<p;k++)
{
*(c + i*n + j) += *(a + i*n + k) * (*(b + m*k + j));
}
printf("%d ", *(c + i*n + j));
}
printf("\n");
}
}

oregon
07-06-2013, 22:20
Puoi inserire anche il main con cui chiami quella funzione e i dati in input/output ?

Eduadie
07-06-2013, 23:56
#include <stdio.h>
#include <stdlib.h>

void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p);
void matrice (int *a, short int m, short int n);

int main()
{
short m, n, p1, p2;
int *a, *b, *c;
printf("Programmazione II - Esercizio 29\n");

do
{
printf("\nInserisci le dimensioni delle matrici A e B (ricorda le colonne di A uguali alle righe di B)\n\n");
printf("Inserisci il numero di righe della matrice A\n");
scanf("%hd", &m);
printf("Inserisci il numero di colonne della matrice A\n");
scanf("%hd", &p1);
printf("Inserisci il numero di righe della matrice B\n");
scanf("%hd", &p2);
printf("Inserisci il numero di colonne della matrice B\n");
scanf("%hd", &n);
} while (p1 != p2);

a = calloc(m*p1, sizeof(int));
b = calloc(p2*n, sizeof(int));
c = calloc(m*n, sizeof(int));

printf("\nInserisci gli elementi della matrice A[%hd][%hd]\n", m, p1);
matrice(a, m, p1);
printf("\nInserisci gli elementi della matrice B[%hd][%hd]\n", p2, n);
matrice(b, p2, n);

printf("\nMatrice C[%hd][%hd] prodotto di AxB\n", m, n);
righe_x_colonne(a, b, c, m, n, p1);

free(a);
free(b);
free(c);

return 0;
}
void matrice (int *a, short int m, short int n)
{
short int i, j;
int num;

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("Inserisci elemento [%hd][%hd] = ", i+1, j+1);
scanf("%d", &num);
*(a + i*n + j) = num;
}
}
}
void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p)
{
int i, j, k;

for(i=0;i<m;i++)
{
printf("\t");
for(j=0;j<n; j++)
{
for(k=0;k<p;k++)
{
*(c + i*n + j) = *(c + i*n + j) + *(a + i*n + k) * *(b + m*k + j);
}
printf("%d ", *(c + i*n + j));
}
printf("\n");
}
}


Ecco a te, ti ringrazio per l'interesse :)

oregon
08-06-2013, 13:25
Ho scritto così il tuo main



int i, j, k;
int z1, z2, z3;

for(i=0;i<m;i++)
{
//printf("\t");
for(j=0;j<n; j++)
{
for(k=0;k<p;k++)
{
z1 = i*n+j;
z2 = i*n+k;
z3 = m*k+j;
printf("%d + %d x %d\n", z1, z2, z3);
*(c + z1) = *(c + z1) + *(a + z2) * *(b + z3);
}
//printf("%d ", *(c + z1));
}
printf("\n");
}


per controllare gli indici che utilizzi nelle operazioni di somma/prodotto

Come puoi controllare nel caso di matrici 3x2 e 2x3 gli indici vanno oltre il consentito ...

Eduadie
08-06-2013, 15:14
Se ho capito bene il tuo codice mi riporta gli indici delle componenti per l'operazione del prodotto scalare proprio come sono rappresentate in memoria (cioè in un vettore scalare) e giustamente se metto due matrici 3x2 e 2x3 non capisco perchè mi escono 7 e 8 quando dovrebbero arrivare sino a 6 giusto? Ma poi perchè su alcune funziona e altre no? Proprio non ci riesco... :dhò:

oregon
08-06-2013, 15:51
Evidentemente l'algoritmo che hai usato per implementare la regola della moltiplicazione degli elementi della matrice non è corretto.

Rivedi la teoria, con carta e matita, della moltiplicazione di una matrice 3x2 per una 2x3 e segna quali dovrebbero essere gli indici sulla carta. Poi rivedi il codice.

Eduadie
08-06-2013, 17:54
Grazie per la pazienza e i consigli che mi stai dando.
Ripetendo l'algoritmo a carta e penna e i risultati che dovrei ottenere mi accorgo che è la seconda colonna dell'operazione ad essere sbagliata ed è quindi la matrice A a non essere selezionata per bene...

Purtroppo non riesco a capire proprio come sia la formula della seconda colonna...

edit: finalmente sono riuscito a risolvere. Le tre formule credo siano queste

z1 = i*n+j;
z2 = i*p+k;
z3 = m*k+j;

Solo che in fase di run crasha il programma >.<

oregon
08-06-2013, 18:05
Scusa, puoi scrivere qui cosa hai scoperto con carta e matita ... ? Spiegalo ...

Eduadie
08-06-2013, 18:19
Scusa se ti sto rompendo!
Ora sono riuscito addirittura a farlo funzionare, tutto apposto.
Comunque avevo scoperto che in pratica le cifre nella seconda colonna delle operazioni (che poi erano le cifre delle righe di A) dovevano ripetersi per tante volte quante le componenti delle colonne di B, per esempio nel caso delle matrici 3x2 e 2x3 erano sempre 2 che si ripetevano per 3 volte. Ciò che non consideravo io era comunque il fatto che non consideravo il numero delle colonne di A e delle righe di B (la variabile p) che deve essere uguale affinchè sia possibile il prodotto righe x colonne ma che nello stesso tempo era un valore delle due matrici.

Finalmente sono riuscito a risolverlo, ti devo davvero molto, stavo impazzendo e invece tu mi hai fatto ragionare grazie.

So forse che nella spiegazione non sono stato chiaro come te, ma fidati qualcosa ci ho capito dove ho sbagliato e ti chiedo ancora scusa per il disturbo.

Grazie e alla prossima (XD)!

Loading