Traiter une structure de données 1D comme une grille 2D

48

Je travaille avec une classe native qui représente une image 2D sous la forme d'un tableau 1D. Si vous souhaitez modifier un pixel, par exemple, vous devez maintenant comment obtenir l'index à partir des x,ycoordonnées.

Donc, disons que nous avons un tableau 1D array1dcomme celui-ci:

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 ]

Dans le contexte de notre programme, array1dreprésente une grille 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

Et nous voulons effectuer des opérations array1dtelles que:

  • Obtenir la valeur aux x,ycoordonnées (dans cet exemple, 1,2donnerait l)
  • Obtenez n'importe quelle sous-grille en utilisant x,y,width,height( 1,2,2,2donnerait [l, m, q, r])
  • Définir la valeur à n'importe quelle x,ycoordonnée (etc.)

Comment faisons-nous cela?

GladstoneKeep
la source
Dans Matlab, et donc les types mathématiques probables (qui se renversent dans CS), convertir une matrice en une autre (que ce soit un 1x12 en 2x6 ou un 2x6 en 3x4) est appelé "refaçonnage" mathworks.com/help/matlab/ ref / reshape.html
@MichaelT: le PO ne remodèle pas la grille. Aucune mention de refaçonner le 5x5 à autre chose (ce qui n'aurait aucun sens de toute façon). :)
Résumé de
@Abstract cette question était dans la révision 1 cependant.

Réponses:

86

2D / 1D - la cartographie est assez simple. Étant donné les tailles de tableau x et y, et 2D width(pour la direction x) et height(pour la direction y), vous pouvez calculer l'index correspondant idans un espace 1D (à base zéro) en

i = x + width*y;

et l'opération inverse est

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

Vous pouvez facilement l'étendre à 3 dimensions ou plus. Par exemple, pour une matrice 3D dont les dimensions sont "largeur", "hauteur" et "profondeur":

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

et inverser:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
Doc Brown
la source
@awashburn c'est la manière traditionnelle de le faire, il est même intégré dans les compilateurs pour les tableaux 2D statiques
fratchet freak
@mtoast: Je ne pense pas, c'est juste un calcul mathématique entier de base.
Doc Brown
Cet exemple est faux pour la 3D. La profondeur de mot dans le calcul doit être la hauteur.
jiggunjer
@jiggunjer: merci pour la correction, a changé ma réponse en conséquence.
Doc Brown
1
@makakas: c'est un exercice laissé au lecteur ;-). Astuce: vous devez ajouter / soustraire la limite inférieure sous forme de décalage aux bons endroits. Mais avant d’essayer ceci, clarifiez vous-même lequel des deux tableaux que vous voulez dire, le tableau 1D ou le tableau 2D.
Doc Brown