Behandlung einer 1D-Datenstruktur als 2D-Gitter

48

Ich arbeite mit einer nativen Klasse, die ein 2D-Bild als 1D-Array darstellt. Wenn Sie beispielsweise ein Pixel ändern möchten, müssen Sie jetzt festlegen, wie der Index aus den x,yKoordinaten abgeleitet werden soll.

Nehmen wir also an, wir haben ein 1D-Array array1dwie dieses:

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 ]

Stellt im Rahmen unseres Programms array1dein 2D-Raster dar:

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

Und wir möchten Operationen ausführen array1dmit:

  • Ermitteln Sie den Wert an x,yKoordinaten (in diesem Beispiel 1,2würde geben l)
  • Holen Sie sich ein Sub-Grid mit x,y,width,height( 1,2,2,2würde geben [l, m, q, r])
  • Setze den Wert auf eine beliebige x,yKoordinate (etc.)

Wie machen wir das?

GladstoneKeep
quelle
In Matlab und somit wahrscheinlich in Mathe-Typen (die in CS übergehen) wird das Umwandeln einer Matrix in eine andere (sei es eine 1x12 in eine 2x6 oder eine 2x6 in eine 3x4) als "Umformen" bezeichnet. Mathworks.com/help/matlab/ ref / reshape.html
@MichaelT: Das OP formt das Gitter nicht um. Keine Erwähnung, den 5x5 zu etwas anderem umzugestalten (was sowieso keinen Sinn ergibt). :)
IAbstract
@IAbstract diese Frage war in Revision 1 obwohl.

Antworten:

86

2D / 1D-Mapping ist ziemlich einfach. Bei gegebenen x- und y- und 2D-Array-Größen width(für x-Richtung) und height(für y-Richtung) können Sie den entsprechenden Index iim 1D-Raum (nullbasiert) durch berechnen

i = x + width*y;

und der umgekehrte Vorgang ist

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

Sie können dies problemlos auf 3 oder mehr Dimensionen erweitern. Zum Beispiel für eine 3D-Matrix mit den Dimensionen "Breite", "Höhe" und "Tiefe":

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

und umgekehrt:

x = i % width;
y = (i / width)%height;
z = i / (width*height);
Doc Brown
quelle
@awashburn, das ist der traditionelle Weg, es ist sogar in Compiler für statische 2D-Arrays eingebaut
Ratschenfreak
@mtoast: Ich glaube nicht, es ist nur eine einfache Ganzzahl-Mathematik.
Doc Brown
Dieses Beispiel ist für 3D falsch. Die Worttiefe in der Berechnung sollte height sein.
Jiggunjer
@jiggunjer: danke für die korrektur, habe meine antwort entsprechend geändert.
Doc Brown
1
@makakas: das ist eine Übung, die dem Leser überlassen bleibt ;-). Hinweis: Sie müssen die Untergrenze als Versatz an den richtigen Stellen addieren / subtrahieren. Bevor Sie dies versuchen, klären Sie selbst, welches der beiden Arrays Sie meinen, das 1D- oder das 2D-Array.
Doc Brown