Io sono abituato ad intendere m x n come m righe per n colonne. E questa abitudine direi che deriva dai libri di matematica.

Beh, il fatto di allocare prima le colonne e poi le righe .. dipende. L`importante e` che _prima_ allochi un array di puntatori e che poi in ciascun puntatore di tale array allochi un array di valori. Sta a te poi vedere quali considerare le righe e quali le colonne. In C sara` sempre e cmq un array di array.

Una cosa pero` resta fissa. Il primo indice e` ovviamente quello dell`array di puntatori, e il secondo quello dei "sotto-array". Di conseguenza, nel tuo codice la matrice avra` n righe ed m colonne.

Scorrimento n x m:

codice:
for( i = 0; i < n; ++i )
    for( j = 0; j < m; ++j )
        scanf( "%f", &a[ i ][ j ] );
Scorrimento m x n:

codice:
for( j = 0; j < m; ++j )
    for( i = 0; i < n; ++i )
        scanf( "%f", &a[ j ][ i ] );
Come vedi puoi facilmente capovolgere il punto di vista, leggendo la trasposta.

Ciao.