http://it.wikipedia.org/wiki/Moltiplicazione_di_matric, questo e' il link di wikipedia, il mio professore di matematica lo ha usato per disegnare la terza dimensione sul piano cartesiano e per modificare la forma di partenza( anzi forse era piu il piano di Gauss ).
Intanto il codice da te presentato presume che in partenza si debbano avere 2 matrici identiche, infatti se guardi sul link di wiki usa 2 matrici diverse e il loro prodotto da una matrice che e' diversa dalle 2 di partenza.
nel tuo caso la casella
c[0][0]= somma( a[0][0]*b[0][0], a[0][1]*b[1][0]......)
praticamente la somma dei prodotti della coppia di elementi della riga e colonna selezionata da c in quel momento.
nel saso di
c[2][3]=somma(a[2][0]*b[0][3], a[2][1]*b[1][3]......)
infatti se controlli il codice la matrice c usa esclusivamente i contatori i, j quindi gli elementi vengono selezionato sequenzialmente, mentre A usa i, k, e B usa k, j, e per come e' impostato i e' l'indice di riga mentre j e' l'indice di colonna e il ciclo piu interno seleziona gli elementi della righa di A con indice i e tutti gli elementi della colonna di B con indice di colonna j.
Annidare molti cicli interni diventa molto laborioso e difficilissimo da gestire volendo potresti fare la trasposta di B e creare un metodo in piu che ti fa il prodotto di di array.
C
[j] = prodottoArray( A, B[j] ) naturalmente dopo avere trasposta la B
Il nome del metodo non sarebbe propriamente adatto dal momento che risulterebbe una somma del prodotto di lementi e il codice risulterebbe semplicemente
for( int i=0; i<A.length; a++ )
{
somma += A*B;
}
in questo modo avresti spostato il ciclo piu interno in un metodo estreno e la gestione potrebbe diventare piu semplice.