Ich möchte ein 2D-Array mit einem 1D-Array darstellen. Eine Funktion übergibt die beiden Angaben (x, y) und den zu speichernden Wert. Diese beiden Angaben würden ein einzelnes Element eines 1D-Arrays darstellen und entsprechend einstellen. Ich weiß, dass das 1D-Array die Größe arrayWidth × arrayHeight haben muss, aber ich weiß nicht, wie jedes Element festgelegt werden soll.
Wie unterscheide ich beispielsweise (2,4,3) von (4,2,3)? Ich habe versucht, das Array als x * y festzulegen, aber 2 * 4 und 4 * 2 führen zu derselben Stelle im Array, und sie müssen unterschiedlich sein.
quelle
alpha
und das 2D-Array eine DimensionN
in beide Richtungen mit Indizes hatx, y
, dann laut @JohnKnoeller ,alpha=x+N*y
. Der Weg, dies umzukehren, wäre Einstellungx=alpha%N
undy= (alpha-alpha%N)/N
.Die typische Formel für die Neuberechnung von 2D-Array-Indizes in 1D-Array-Index lautet
Alternativ können Sie verwenden
(vorausgesetzt, dies
arrayWidth
wird entlang der X-Achse undarrayHeight
entlang der Y-Achse gemessen )Natürlich kann man sich viele verschiedene Formeln einfallen lassen, die alternative eindeutige Zuordnungen bieten, aber normalerweise ist dies nicht erforderlich.
In C / C ++ - Sprachen werden integrierte mehrdimensionale Arrays im Speicher gespeichert, sodass sich der letzte Index am schnellsten ändert, dh für ein Array, das als deklariert ist
Element
xy[5][3]
wird sofortxy[5][4]
im Speicher gefolgt . Möglicherweise möchten Sie auch dieser Konvention folgen und eine der beiden oben genannten Formeln auswählen, je nachdem, welchen Index (X oder Y) Sie als den "letzten" der beiden betrachten.quelle
Beispiel: Wir möchten ein 2D-Array mit den Größen SIZE_X und SIZE_Y darstellen. Das bedeutet, dass wir MAXY aufeinanderfolgende Zeilen mit MAXX-Größe haben werden. Daher ist die eingestellte Funktion
Das wäre:
quelle
MAXX
undMAXY
Werte werden zum Verwechseln genannt, weil die Maximalwertex
undy
sindMAXX - 1
undMAXY - 1
jeweils. VielleichtSIZE_X
undSIZE_Y
vielleicht besser?Wie andere gesagt haben C-Karten in Zeilenreihenfolge
Ausgabe:
quelle
am Beispiel eines Zeilenmajors:
quelle
Es ist wichtig, die Daten so zu speichern, dass sie in den verwendeten Sprachen abgerufen werden können. C-Sprache speichert in Zeilenreihenfolge (die gesamte erste Zeile steht an erster Stelle, dann die gesamte zweite Zeile, ...), wobei jeder Index von 0 bis zur Dimension 1 läuft. Die Reihenfolge des Arrays x [2] [3] ist also x [0] [0], x [0] [1], x [0] [2], x [1] [0], x [1] [ 1], x [1] [2]. In der Sprache C wird x [i] [j] an derselben Stelle gespeichert wie ein eindimensionaler Array-Eintrag x1dim [i * 3 + j]. Wenn die Daten auf diese Weise gespeichert werden, können sie leicht in der Sprache C abgerufen werden.
Fortran und MATLAB sind unterschiedlich. Sie werden in Spalten-Hauptreihenfolge gespeichert (die gesamte erste Spalte kommt zuerst, dann die gesamte zweite Zeile, ...) und jeder Index läuft von 1 bis zu seiner Dimension. Die Indexreihenfolge ist also umgekehrt zu C und alle Indizes sind 1 größer. Wenn Sie die Daten in der Reihenfolge C speichern, kann FORTRAN X_C_language [i] [j] mit X_FORTRAN (j + 1, i + 1) finden. Zum Beispiel ist X_C_language [1] [2] gleich X_FORTRAN (3,2). In eindimensionalen Arrays liegt dieser Datenwert bei X1dim_C_language [2 * Cdim2 + 3], was der gleichen Position wie bei X1dim_FORTRAN (2 * Fdim1 + 3 + 1) entspricht. Denken Sie daran, dass Cdim2 = Fdim1 ist, da die Reihenfolge der Indizes umgekehrt ist.
MATLAB ist dasselbe wie FORTRAN. Ada ist dasselbe wie C, außer dass die Indizes normalerweise bei 1 beginnen. Jede Sprache hat die Indizes in einer dieser C- oder FORTRAN-Ordnungen und die Indizes beginnen bei 0 oder 1 und können entsprechend angepasst werden, um an die gespeicherten Daten zu gelangen.
Es tut mir leid, wenn diese Erklärung verwirrend ist, aber ich denke, es ist genau und wichtig, dass ein Programmierer sie kennt.
quelle
Sie sollten in der Lage sein, mit einem einfachen Zeiger auf das 2d-Array zuzugreifen. Das Array [x] [y] wird im Zeiger als p [0x * Breite + 0y] [0x * Breite + 1y] ... [0x * Breite + n-1y] [1x * Breite + 0y] usw. Angeordnet .
quelle