Newsgroup: it.comp.lang.c
Titolo: prodotto tra matrici

Ciao a tutti, sono nuovo del linguaggio C (ho iniziato a studiarlo 
quest'anno) e adesso stiamo lavorando sulle matrici. Vorrei scrivere un 
programma che mi permetta di calcolare il prodotto di due matrici. Per 
riempire le due matrici da moltiplicare non c'è problema, il fatto è che 
non so come creare un ciclo per far eseguire il prodotto. Non capisco se 
la sequenza della moltiplicazione righe per colonne varia in modo 
costante, così da permettermi ad esempio con un ciclo for di tenere 
fissa una riga ed eseguire i prodotti con tutte le colonne. (la 
matematica non è il mio forte...)
Potete aiutarmi? Grazie.

 programma che mi permetta di calcolare il prodotto di due matrici.
Scusa se la cosa mi sembra strana,
ma il prodotto di matrici e' veramente un problema scemo
che dovresti saper risolvere dopo la prima lezione di C.
Apri un qualunque libro di algebra lineare e trovi
la definizione di prodotto matriciale che si traduce immediatamente
nel codice C. Non c'e' praticamente nulla da pensare.
Comunque in questo minuto sono ben disposto...
Il prodotto C di due matrici, diciamo A  e B con dimensioni
A (m x n) e B (n x p) e' una matrice C di dimensione m x p.
e si calcola elemento per elemento come
C(i,j) = somma per t=1,2...,n di A(i,t)*B(t,j).
tutto cio' si traduce immediatamente nel seguente frammento
di codice, dove la variabile acc serve per accumulare la somma di cui sopra
e gli indici vengono fatti partire da 0 invece che da 1
come si usa di solito in linguaggio C.
double A[m][n], B[n][p], C[m][p];
double acc;
int i,j,t;
for (i=0; i<m; i++)
for (j=0; j<p; j++)
{
   acc = 0.0;
   for (t=0; t<n; t++)
        acc += A[i][t]*B[t][j];
   C[i][j]=acc;
}
fatto !
Dai, ammettilo, se ci pensavi tre o quattro minuti ci saresti
riuscito anche da solo. :-)
ciao,
g.

 riuscito anche da solo. :-)
La mia esperienza è  che per chi è  alle prime armi la moltiplicazione 
matrice per matrice rappresenta un esercizio non banale,  anche per chi 
non ha eccessivi problemi con la matematica.
In genere, con studenti universitari,  riesco ad avere una traduzione 
rapida e corretta in linguaggio di programmazione solo se prima traduco 
l'  algoritmo in una forma intermedia tra formula matematica e programma:
Per ogni i  da 0 a m-1
Per ogni j  da 0 a p-1
azzero Cij
Per ogni k  da 0  a n-1
    Cij = Cij + Aik*Bkj
Una volta capito che occorre un ciclo in corripondenza di ciascun "Per 
ogni..."  il gioco è  fatto.
Giorgio

 Giorgio
Grazie per la risposta, ma come ho scritto il mio principale problema è 
appunto matematico: nella definizione di matrice non capisco perchè a 
volte viene usato m x n e altre m x p (non sarebbe molto più semplice r 
x c, ovvero righe per colonne?!!) e quindi mi risulta poco comprensibile 
anche il codice. J e k sono gli indici per riga e colonna, giusto? Per 
semplificare le cose volevo moltiplicare due matrici 2x2
Per cui avrò nella matrice prodotto in posizione 0.0 [(a 0.0)x(b 0.0)+(a 
0.1)x(b 1.0)] in posizione 0.1 [(a 0.0)x(b 0.1)+(a 0.1)x(b 1.1)] ecc.
ma non capisco come fare incrementare e decrementare j e k, visto che 
non variano in modo costante (almeno così mi sembra).
Grazie in anticipo per l'aiuto.

 x c, ovvero righe per colonne?!!) 
Forse se hai questi dubbi dovresti chiedere
su it.scienza.matemtica o piu' semplicemente
ri-aprire il tuo libro di algebra o di calcolo numerico e fare
a mano qualche calcolo per prenderci la mano.
Quando si scrive matrice m x n,
il primo numero sono sempre le righe e il secondo sono
sempre le colonne. Indipendentemente dalle lettere p,n,m,q,etc.etc.
che si usano per denotarle.
A me sembra che sia io che Giorgio ti abbiamo gia' spiegata
la formula per l'elemento C(i,j) di un prodotto di matrici.
Te lo ripeto in un altro modo.
Per ottenere il generico elemento di posizione (i,j)
(il primo indice indica la riga, il secondo la colonna,
quindi il generico elemento in riga i e colonna j,
devi "combinare" tra di loro la i-esima riga della matrice A
con la j-esima colonna della matrice B.
Questi due vettori avranno (per definizione stessa di moltiplicazione
tra matrici) lo stesso numero di elementi.
Gli elementi della riga i-esima di A saranno
A(i,1) A(i,2) A(i,3) .... A(i,n) dove n e' il numero di colonne di A.
mentre gli elementi della colonnaj-esima di B saranno
B(1,j) B(2,j) B(3,j) .... B(n,j) dove n e' il numero di righe di B.
quando dico che devo "combinare" questi due vettori
intendo che devo fare i prodotti termine a termine e sommare
il risultato.
Quindi
C(i,j) = A(i,1)*B(1,j) + A(i,2)*B(2,j) + ... + A(i,n)*B(n,j)
quindi, in modo piu' compatto
puoi dire che C(i,j)
e' uguale alla somma, per un indice v che varia tra 1 e n (numero di
colonne di A e di righe di B) di A(i,v)*B(v,i).
Cerca di capire la cosa sopra. (In realta' non c'e' niente da capire,
perche e' la DEFINIZIONE  di prodotto matriciale).
Una volta che ti e' chiaro che puoi calcolare
un elemento di C con un ciclo, allora ti basta
ripetere la cosa per tutti gli elementi di C
(usando altri due cicli).
E naturalmente devi avere l'accortezza di
far partire gli indici da 0 anziche' da 1.
Nel caso delle matrici 2 x 2 otterresti una cosa come:
A(0,0) A(0,1)
A(1,0) A(1,1)
B(0,0) B(0,1)
B(1,0) B(1,1)
e poi C = AB uguale a
C(0,0)=prima riga di A per prima colonna di B
= A(0,0)*B(0,0)+A(0,1)*B(1,0).
C(0,1)=prima riga di A per seconda colonna di B =
= A(0,0)*B(0,1) + A(0,1)*B(1,1)
etc.etc.
comunque e' piu' facile
capire la formula nel caso generale piuttosto
che su un esempio molto particolare.
ciao,
g.