In breve: qualsiasi matrice memorizzata in locazioni contigue viene necessariamente "serializzata". Il fatto è che esistono vari possibili percorsi lineari, tutti ugualmente validi: per righe, per colonne, per (anti)diagonali, bustrofedici (vulgo: a zig-zag) e non. I più diffusi linguaggi e ambienti di programmazione si limitano alle convenzioni più banali, ossia row-major e column-major. Vale a dire, data la matrice 4x3 seguente:
La relativa rappresentazione in column-major order genererà la seguente immagine in memoria:
1 5 9 2 6 10 3 7 11 4 8 12
In rosso le colonne che il testo richiede di stampare, facendo riferimento ad indici zero-based (corretto informaticamente, ma contrario all'abitudine invalsa in algebra lineare).
Siano NUM_ROWS e NUM_COLS, con intuitivo significato, le dimensioni della matrice memorizzata. A questo punto, il problema è praticamente risolto. Tutto ciò che ti occorre è:
- Un loop interno, in grado di copiare NUM_ROWS word (16 bit) consecutive nel vettore di output, a partire da un offset sorgente dato;
- Un loop esterno, che generi in successione gli offset delle colonne dispari da cui far partire di volta in volta il loop interno, ovvero le locazioni dei valori (word) sottolineati nell'esempio sopra fornito. E' banale notare che la sequenza di tali offset è ottenibile additivamente con una banalissima equazioncina algebrica, senza if o altri controlli...
Questo l'approccio concettuale più naif al problema. Le ottimizzazioni immediate possibili sono almeno mezza dozzina, di cui non meno di due o tre a portata di studente, ma per il momento fermiamoci qui.

Rispondi quotando