Abstrakt:
So wie ich es verstehe (obwohl ich ein sehr begrenztes Verständnis habe), gibt es drei Dimensionen, mit denen wir (normalerweise) physisch arbeiten:
Die 1. würde durch eine Linie dargestellt.
Die 2. wird durch ein Quadrat dargestellt.
Der dritte würde durch einen Würfel dargestellt.
Einfach genug, bis wir zum 4. kommen - Es ist ein bisschen schwierig, in einem 3D-Raum zu zeichnen, wenn Sie wissen, was ich meine ... Einige Leute sagen, dass es etwas mit der Zeit zu tun hat .
Die Frage:
Nun, obwohl das alles nicht viel Sinn macht, ist das alles großartig für mich. Meine Frage bezieht sich nicht darauf, oder ich würde sie auf MathSO oder PhysicsSO stellen. Meine Frage ist: Wie geht der Computer mit Arrays um?
Ich weiß, dass Sie 4D-, 5D-, 6D- usw. Arrays in vielen verschiedenen Programmiersprachen erstellen können, aber ich möchte wissen, wie das funktioniert.
Antworten:
Glücklicherweise sind Programme nicht durch die physischen Einschränkungen der realen Welt beschränkt. Arrays werden nicht im physischen Raum gespeichert, daher spielt die Anzahl der Dimensionen des Arrays keine Rolle. Sie werden zu einem linearen Speicher abgeflacht. Ein eindimensionales Array mit zwei Elementen könnte beispielsweise folgendermaßen aussehen:
Ein 2x2 dimensionales Array könnte dann sein:
Ein dreidimensionales 2x2x2-Array könnte sein:
Sie können hoffentlich sehen, wohin das führt. Vier Dimensionen könnten sein:
quelle
int a[2][2][2];
wäre ein dreidimensionales Array.Sie müssen sich das nicht in großen räumlichen Dimensionen vorstellen, sondern stellen es sich als Farnblatt vor.
Der Hauptstiel ist Ihr erstes Array, wobei jeder Zweig ein Element ist, das es speichert. Wenn wir einen Ast betrachten, ist dies Ihre zweite Dimension. Es hat eine ähnliche Struktur von kleineren Zweigen, die seine Daten darstellen. Diese wiederum haben ihre eigenen kleinen Zweige, die sich fortsetzen, bis wir zu den winzigen Blättern gelangen, die die Daten des Arrays mit der innersten oder höchsten Dimension darstellen.
Sie können diesen Aufbau sehen, wenn Sie jede Ebene mit einem eigenen Namen deklarieren. Hier verwende ich jede Variable, um den Code zu minimieren:
quelle
Die Dimensionen sind, was immer Sie sein wollen, die 4. Dimension muss nicht unbedingt Zeit sein. Wenn Sie sich drei Dimensionen als Würfel vorstellen, können Sie sich vier Dimensionen als eine Reihe von Würfeln vorstellen. 5 Dimensionen, ein Gitter aus Würfeln und so weiter.
Sie könnten auch eine 3D-Sammlung von Voxeln haben, wobei die 4. Dimension die Farbe oder Dichte oder eine andere Eigenschaft ist.
Wenn Sie den Speicher für Ihr mehrdimensionales Array zuordnen, ordnet es einfach das Produkt jeder Dimension maximal für Ihren Datentyp zu. Wenn Sie ein 3D-Array oder einen "Würfel" mit 10 Elementen in jeder Dimension haben, werden Ihnen 1.000 Elemente zugewiesen. Wenn Sie dies zu einem 4D-Array mit 10 Elementen in der 4. Dimension machen, weist der Computer nur 10.000 zu. Erhöhen Sie die Anzahl der Dimensionen um bis zu 5, und es werden 100.000 zugewiesen.
Dem Computer ist es egal, welche Bedeutung die einzelnen Dimensionen haben. Um auszuwählen, wo sich in der Liste der Elemente ein einzelner Punkt befindet, müssen Sie nur eine Speicheradresse multiplizieren.
quelle
Stellen Sie sich vor, Sie arbeiten an einem neuen medizinischen Gerät, einer Reihe von Sensoren, die Sie den Armen eines Patienten entlangführen. Sie haben sieben Freiwillige zum Testen angestellt. Jeder Sensor meldet Niederfrequenz-, Mittelfrequenz- und Hochfrequenzmessungen, die Sie etwa eine Minute lang alle 100 ms durchführen.
Wie speichere ich all diese Daten zur Analyse und zum Plotten im Speicher?
Offensichtlich ein Array. Es würde so aussehen (mit erfundenem generischem Pseudocode):
Das ist ein fünfdimensionales Array, und es gibt nichts Kniffliges, Mysteriöses oder Verblüffendes. Es gibt keinen Grund, es mit dem 5-dimensionalen euklidischen Raum in Verbindung zu bringen. Um einen Datenwert zu erhalten, verwenden wir einen Ausdruck wie
Es ist wie beim Abfragen einer relationalen Datenbank, in der Sie einen Datensatz für jeden Datenwert haben, wobei fünf Spalten die Patienten-ID, die Sensor-ID usw. und eine Spalte mit dem Wert enthalten. Um einen Datenpunkt zu erhalten, verwenden Sie fünf Terme im WHERE: SELECT-Wert FROM SensorData WHERE (patientid = 6) und (sensorid = 5) und (arm = "left") und (channel = "midfreq") und (sampleindex = 338 ).
Es ist nichts Mystisches an einer Datenbanktabelle mit fünf oder mehr Spalten, oder?
(Ich verwende 1-basierte Indizierung, obwohl 0-basierte im wirklichen Leben viel häufiger ist.)
Beachten Sie, dass ich ein böser Junge bin, weil ich die Anzahl der Arme fest programmiert habe. Wenn ich jemals Geld für die Untersuchung dieser Sensoren an einem Oktopus bekomme, stecke ich in Schwierigkeiten!
quelle
Ein Array ist nur ein Block kontinuierlichen Speichers. Die Speicheradressierung ist eindimensional. Sie können vorwärts oder rückwärts gehen. Wenn Sie also ein Array mit 5 Elementen haben, werden 5 Speicherblöcke reserviert. Wenn Sie ein zweidimensionales Array mit 5 Elementen in jeder Dimension haben, werden 25 Speicherblöcke reserviert.
quelle
Tatsächlich würden Mathematiker niemals (oder zumindest normalerweise nicht) eine vierte Dimension mit so etwas wie Zeit in Verbindung bringen. Sie würden die ersten drei auch nicht mit einem Raum in Verbindung bringen wie: Mathematiker definieren Dimension einfach als abstrakte Eigenschaft eines typischen Vektorraums (häufig wird dies auf Mannigfaltigkeiten oder sogar metrische Räume verallgemeinert ). Und dieser abstrakten Definition ist es egal, wie viele Dimensionen der physische Raum hat, in dem wir uns gerade bewegen. Das Konzept der Dimensionen gilt für Räume, die dem physischen Raum nicht einmal ähneln. In der Tat verwenden Mathematiker (und sogar Physiker) sehr oft unendlich-dimensional Räume, wie die Hilbert-Räume der Quantenmechanik.
Nachdem dies geklärt ist, sprechen wir über Arrays - Sie müssen Vektorräume nicht verstehen, da die abstrakte Definition hier tatsächlich viel einfacher ist.
An ( l 0 × l 1 × l 2 × ... × l n -1 ) -sized Array (dh der Dimension n ) ist einfach eine Sammlung von l 0 ⋅ l 1 ⋅ ... ⋅ l n -1 Nummern ( oder welcher Objekttyp auch immer das Array füllt). Der einzige Unterschied zu einem eindimensionalen Array dieser Länge besteht darin, dass Sie eine besonders nützliche Möglichkeit haben, die Dimensionen separat zu indizieren, nämlich
i lin = i n -1 + l n -1 ⋅ ( i n -2 + l n -1 ⋅ (... l 2 ⋅ ( i 1 + l 1 ⋅ i 0 ) ...))
quelle
imshow
in Python) - es kann zwei räumliche Dimensionen sowie eine dritte Farbdimension anzeigen.Bei der Programmierung sind Arrays recht einfach zu implementieren, aber möglicherweise nicht zu verstehen.
Im Allgemeinen bedeutet jede Ebene von Arrays, dass der Inhalt
n
faltbar ist. Das bedeutetint x[4]
sind 4 Blöcke, von denen jeder einen enthältint
.int x[5][4]
sind 5 Blöcke, von denen jeder einen enthältint[4]
.int x[3][5][4]
sind 3 Blöcke, von denen jeder einen enthältint[5][4]
.int x[2][3][5][4]
sind 2 Blöcke, von denen jeder einen enthältint[3][5][4]
.Wie Sie sich auf sie beziehen, liegt bei Ihnen, aber zum besseren Verständnis haben Sie so etwas wie
COLUMN
für den letztenROW
für den vorletztenPAGE
für den drittletztenBis hierher habe ich es irgendwo gelesen. Um hier zu bleiben, können wir auch definieren
BOOK
für den viertletztenSHELF
für den fünftletzten. (Oder, wenn Sie es vorziehen,SHELFROW
damit wir weitermachen können.)Das heißt, ich habe nie ein Array mit mehr als 4 oder vielleicht 5 Dimensionen im "wilden Leben" gesehen.
Auf diese Weise können Sie sich
int x[6][2][3][5][4]
eine Sammlung von 6 "Regalen" mit jeweils 2 Büchern und 3 Seiten mit jeweils 5 Zeilen und 4 Spalten vorstellen .quelle
Stellen Sie sich ein eindimensionales Array wie eine Kommode vor:
Jede Schublade ist ein Index des Arrays. Sie können in jede Schublade ein beliebiges Element einfügen, und für viele Zwecke enthält jede Schublade nur ein einzelnes Element (das ist ein eindimensionales Array).
Diese Kommode ist jedoch magisch, sodass sie nicht durch den physischen Raum begrenzt ist. Das bedeutet, dass Sie eine weitere Kommode in jede Schublade der ersten Kommode legen können . Die inneren Kommoden können dann alles enthalten, was Sie wollen. Das ist ein zweidimensionales Array.
Man kann also so etwas wie "Öffne die oberste Schublade der ersten Kommode, hole die Kommode aus dieser Schublade und öffne dann die unterste Schublade dieser zweiten Kommode" sagen. Das wäre wie der Zugriff auf einen Index eines 2D-Arrays: myArray [0] [3];
Und natürlich können die Kommoden in der äußersten Kommode selbst Kommoden enthalten. Das ist ein dreidimensionales Array.
Ihre Frage lautet also: Was ist ein vierdimensionales Array? Es ist natürlich eine Kommode, eine Kommode, eine Kommode, eine Kommode!
Es ist Schubladen ganz nach unten.
quelle
myArray[0][3]
wäre es stattdessenmyArray[0][2]
. Ansonsten aber gute Erklärung.Die meisten Aspekte dieser Frage wurden bereits berücksichtigt, aber ich denke, es wird hilfreich sein, wenn Sie die Natur einer Dimension berücksichtigen. Nicht alle Dimensionen sind räumlich. Eine Dimension ist ein Kontext für die Messung. Hier sind einige Beispiele:
Die "vierte" Dimension ist nur die vierte, da es drei räumliche Dimensionen gibt. Raum und Zeit sind groß, weil sie groß sind. Sehr viel in deinem Gesicht. Aber jede quantifizierbare, messbare Qualität kann eine Dimension sein, wenn Sie sie messen.
Büstenhalter haben zum Beispiel drei Dimensionen: Körbchengröße, Brustgröße und Zwischengröße (Ich weiß nicht, wie Ihr Mädels es nennt, aber ich meine den Abstand zwischen den Körbchen).
quelle
In der Physik nehmen wir an, dass jede räumliche Dimension unendlich ist, was es ziemlich schwierig macht, Raum für neue Dimensionen zu finden.
Beim Umgang mit endlichen Arrays ist es einfach, Platz zu finden.
Stellen Sie sich ein Blatt Papier mit einem aufgedruckten Gitter vor. Sie können einige Informationen in jede Zelle des Rasters schreiben. Das ist ein 2D-Array: Zeile und Spalte.
Legen Sie mehrere dieser Blätter in einen Ordner. Das ist ein 3D-Array: Seite, Zeile und Spalte.
Legen Sie mehrere dieser Ordner in eine Dateikiste. 4D Array: Ordner, Seite, Zeile, Spalte.
Ordnen Sie die Kartons in einem rechteckigen Raster auf einer Holzpalette an. 6D Array: Box-Zeile, Box-Spalte, Ordner, Seite, Zeile, Spalte.
Stapeln Sie mehr Gitter von Kisten auf diese. 7D Array: Box-Tiefe, Box-Zeile, Box-Spalte, Ordner, Seite, Zeile, Spalte.
Fangen Sie an, Paletten in einen Versandbehälter zu stopfen: 9D array. (Angenommen, jeder Stapel ist so hoch wie das Innere des Behälters, so dass Sie hier nur noch 2 Dimensionen erhalten können.)
Stapeln Sie Versandbehälter auf dem Deck eines Containerschiffs: 12D-Array.
Ihre Flotte von Containerschiffen ist jetzt ein 13D-Array.
quelle
Im kartesischen Koordinatensystem liegen die x- und y-Achsen in einer Ebene. Sie können eine beliebige Zahl in der Ebene als (x, y) darstellen.
Im dreifachen "Raum" (auch bekannt als Würfel) können Sie die x-, y- und z-Achse haben. Sie können jedes Element des Würfels als (x, y, z) darstellen.
Im multivariaten Raum können Sie die x-, y-, z- und w-Achse haben (wobei die w-Achse "imaginär" ist). Sie können jedes Element dieses Raums als (x, y, z, w) darstellen.
Alle diese Punkte im Raum werden mit Vektoren bezeichnet. Im Vier-Raum können Sie zwei Vektoren haben, wobei v1 = (x1, y1, z1, w1) und v2 = (x2, y2, z2, w2). Dann manipulieren Sie diese Vektoren wie Zahlen. Beispielsweise wäre die Summe der beiden Vektoren v1 + v2 (x1, y1, z1, w1) + (x2, y2, z2, w2). Dann addieren Sie diese Vektoren termweise wie Zahlen, um Folgendes zu erhalten: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).
Ihr Programm definiert die Vektoren mit den entsprechenden Arrays und führt dann arithmetische Operationen in der entsprechenden Reihenfolge aus.
quelle