Trattare una struttura di dati 1D come griglia 2D


48

Sto lavorando con una classe nativa che rappresenta un'immagine 2D come un array 1D. Se si desidera modificare un pixel, ad esempio, è necessario ora come derivare l'indice dalle x,ycoordinate.

Quindi, supponiamo di avere un array 1D array1dcome questo:

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

Nel contesto del nostro programma, array1drappresenta una griglia 2D:

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

E vogliamo eseguire operazioni array1dcome:

  • Ottieni il valore alle x,ycoordinate (in questo esempio 1,2darebbe l)
  • Ottieni qualsiasi sottorete usando x,y,width,height( 1,2,2,2dare [l, m, q, r])
  • Imposta il valore su qualsiasi x,ycoordinata (ecc.)

Come li facciamo?


In Matlab, e quindi probabilmente i tipi di matematica (che si riversano in CS), convertire una matrice in un'altra (sia essa un 1x12 in un 2x6 o un 2x6 in un 3x4) è noto come "rimodellamento" mathworks.com/help/matlab/ ref / reshape.html

@MichaelT: l'OP non sta rimodellando la griglia. Nessuna menzione di rimodellare il 5x5 in qualsiasi altra cosa (che non avrebbe comunque senso). :)
Estratto del

@Abstract quella domanda era nella revisione 1 però.

Risposte:


86

2D / 1D - la mappatura è piuttosto semplice. Date x e y e dimensioni dell'array 2D width(per la direzione x) e height(per la direzione y), è possibile calcolare l'indice corrispondente inello spazio 1D (basato su zero) per

i = x + width*y;

e l'operazione inversa è

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

Puoi estenderlo facilmente a 3 o più dimensioni. Ad esempio, per una matrice 3D con dimensioni "larghezza", "altezza" e "profondità":

i = x + width*y + width*height*z;

e viceversa:

x = i % width;
y = (i / width)%height;
z = i / (width*height);

@awashburn è il modo tradizionale di farlo, è persino integrato in compilatori per array 2D statici
maniaco del cricchetto,

@mtoast: Non penso proprio, è solo la matematica intera di base.
Doc Brown,

Questo esempio è sbagliato per il 3D. La profondità della parola nel calcolo dovrebbe essere altezza.
jiggunjer,

@jiggunjer: grazie per la correzione, ho cambiato la mia risposta di conseguenza.
Doc Brown,

1
@makakas: questo è un esercizio lasciato al lettore ;-). Suggerimento: è necessario aggiungere / sottrarre il limite inferiore come offset nei punti giusti. Ma prima di provare questo, chiarisci a te stesso quale delle due matrici intendi, la 1D o la matrice 2D.
Doc Brown,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.