/ / Puntatore a sub-matrice / sub-matrice a 2 o 3 dimensioni - c ++, matrici, matrice

Puntatore a sub-matrice / sub-matrice a 2 o 3 dimensioni - c ++, matrici, matrice

dì che hai una matrice di dimensioni x per y (per z) definita come:

int** tab = new int*[x];
for(int i=0; i<x; ++i) tab[i] = new int[y];

o

int*** tab = new int**[x];
for(int i=0; i<x; ++i) {
tab[i] = new int*[y];
for(int j=0; j<y; ++y) tab[i][j] = new int[z];
}

c'è un modo intelligente per accedere alla sottomatrice (get int**(*) senza copiare i dati, semplice C ++) che avrà l'angolo in alto a sinistra (-front) [a, b (, c)] e la dimensione di [A, B (, C)]?

Qui ci sono (migliori o peggiori) esempi grafici del problema.

esempio di matrice 2d inserisci la descrizione dell'immagine qui

risposte:

2 per risposta № 1

Stai usando quella che viene chiamata una matrice seghettata. È una matrice di matrici, in cui nulla oltre al runtime impone che i sub array abbiano le stesse dimensioni. Quindi frastagliati, perché potresti avere i subarray di dimensioni variabili.

Per avere un submatrix che è anche aarray frastagliato, è necessario che esista una matrice frastagliata di puntatori che puntano ai sottareti della sottomatrice. Questi non esistono in generale, quindi no, non puoi fare questo "senza copiare" almeno alcuni array di puntatori a sottotitoli.

Se la tua matrice non fosse stata basata su array frastagliati, invece con array singolo passo, quindi è possibile creare visualizzazioni di sottoarray senza allocare nuovi array di puntatori di sottoarray. Inoltre sarebbe più cache friendly.

Per scrivere la matrice non frastagliata, inizia scrivendo una vista della matrice o una classe span che gestisca una dimensione.

Per due dimensioni, aumenti la classe span per memorizzare una tupla di dimensioni o passi delle dimensioni. [] invece di restituire un riferimento all'elemento calcolato, crea un'istanza di estensione a una dimensione inferiore che punta alla posizione calcolata, fino al caso di dimensione 0 in cui si restituisce un riferimento.

Ciò sarà altamente efficiente, consentirà subarrays efficienti, ma richiede alcune dozzine o 100 linee di codice per avere ragione.