Wie funktioniert die vierte Dimension mit Arrays?

30

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.

Fragezeichen
quelle
66
Wenn 3 Dimensionen als Würfel dargestellt werden können, können 4 Dimensionen als Bündel von Würfeln in einer Linie dargestellt werden. 5 Dimensionen können als Raster dargestellt werden, wobei jede Zelle im Raster ... einen Würfel enthält! Und so weiter ... Die "Vierte Dimension" hat nichts mit Zeit zu tun (was auch immer das ist), es sei denn, Sie definieren sie als solche im Kontext der Semantik Ihres Programms.
FrustratedWithFormsDesigner
14
Im Allgemeinen können Sie diesen konzeptuellen Buckel überwinden, indem Sie versuchen, Dimensionen nicht als rein physikalische Konstrukte zu betrachten. Beispielsweise können einige maschinelle Lernprobleme eine Dimension von Hunderttausenden aufweisen, wobei jede Dimension ein Merkmal des Datasets ist.
Steven Evers
6
Denken Sie nach Steve Evers 'Kommentar an einen gebräuchlichen Datentyp: eine RGB-Farbe. Dies hat drei Dimensionen, so dass Sie den RGB- "Farbraum" betrachten können. Fügen Sie nun eine Alpha-Komponente hinzu. Sie haben vier Dimensionen.
Josh Caswell
25
Denken Sie daran, dass sich der Computer nicht für geometrische Dimensionen interessiert - diese sind nur ein Hilfsmittel für den menschlichen Gebrauch. Wenn Sie ein 5x5x5x5-Array zuweisen, weist der Computer nur ein Array mit 625 Elementen zu und rechnet entsprechend mit Ihren Indizes.
David Zhang

Antworten:

77

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:

(0) (1)

Ein 2x2 dimensionales Array könnte dann sein:

(0,0) (0,1) (1,0) (1,1)

Ein dreidimensionales 2x2x2-Array könnte sein:

(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)

Sie können hoffentlich sehen, wohin das führt. Vier Dimensionen könnten sein:

(0,0,0,0) (0,0,0,1) (0,0,1,0) (0,0,1,1) (0,1,0,0) (0,1,0,1) (0,1,1,0) (0,1,1,1)
(1,0,0,0) (1,0,0,1) (1,0,1,0) (1,0,1,1) (1,1,0,0) (1,1,0,1) (1,1,1,0) (1,1,1,1)
Greg Hewgill
quelle
10
Computer-Arrays sind nicht durch menschliches Verständnis oder Visualisierung beschränkt, sondern durch physikalische Einschränkungen, z. B. ein Array von d Dimensionen, die jeweils n ^ d lang sind, oder allgemeiner mit unterschiedlichen Längenabmessungen, n1 × n2 ×… × nd.
acelent
6
@ ColtonAllen: Ich bin nicht ganz sicher, worauf Sie sich beziehen. In der Definition der Bemaßung heißt es: "Grob gesagt handelt es sich um die Anzahl der Koordinaten, die erforderlich sind, um einen Punkt auf dem Objekt anzugeben." Ein in C deklariertes Array int a[2][2][2];wäre ein dreidimensionales Array.
Greg Hewgill
4
"Glücklicherweise sind Programme nicht durch die physischen Einschränkungen der realen Welt beschränkt." Deshalb haben wir alle Prozessoren mit 4.5THz und niemand kümmert sich um die Speicherhierarchie, nicht wahr? Dies ist wirklich die lustigste Antwort, die ich gelesen habe ....
Manu343726
24
@ Manu343726 Er bezieht sich auf die Tatsache, dass wir in (theoretisch) begrenzten Dimensionen von Raum und Zeit leben, aber Arrays im Computerspeicher "vorgeben" Dimensionen haben - es ist alles in einem linear zusammenhängenden Raum im Speicher gespeichert - sie sind also nicht auf die beschränkt Anzahl der Dimensionen, in denen wir leben. Troll nicht> :(
Blackhawk
15
@ Manu343726: Ich habe vorsichtig Programme gesagt , keine Computer . Das ist eines der großartigen Dinge an Software.
Greg Hewgill
49

Sie müssen sich das nicht in großen räumlichen Dimensionen vorstellen, sondern stellen es sich als Farnblatt vor. Farnblatt

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:

leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];
n00begon
quelle
1
Würde diese Visualisierung nicht eher ein gezacktes Array darstellen?
Matt Johnson-Pint
2
@MattJohnson Formal ja, aber dieses Beispiel erklärt / visualisiert auch mehrdimensionale Arrays.
M. Mimpen
4
+1 Dies ist nicht nur eine übersichtliche Visualisierung, sondern eher die Wahrheit als die lineare Erklärung für viele Array-Implementierungen. Ob die meisten Leute hier den Begriff "Array" auf zusammenhängendes Gedächtnis beschränken würden oder nicht, "multidimensionales Array " ist sicherlich der Begriff, der in der Literatur für viele Sprachen für solche Anordnungen verwendet wird.
DeveloperInDevelopment
46

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.

Whatsisname
quelle
26

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):

npatients = 7
nsensors = 4     // number of sensors on an arm
nchannels = 3
nsamples = 60.0 / 0.1
sensordata = Array[ npatients, nsensors, 2, nchannels, nsamples ]

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

x = sensordata[6, 5, 1, 2, 338)

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!

DarenW
quelle
3
+1 Hervorragendes Beispiel dafür, dass Bemaßungen beliebige Daten sein können, die Sie benötigen.
Mike unterstützt Monica
20

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.

Zillolo
quelle
5
Ja, denken Sie daran, wenn Sie Ihren Arrays weitere Dimensionen hinzufügen. Die Speichernutzung ist möglicherweise nicht trivial.
Davidhaskins
18

... oder ich würde es auf MathSO fragen ...

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 0l 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 1i 0 ) ...))

links herum
quelle
Um klar zu sein, benötigen Sie nur ein Array mit 3 Elementen, um 3 Dimensionen zu beschreiben, und ein Array mit N Elementen beschreibt N Dimensionen. Das Detaillieren jedes Vektors ist jedoch eine andere Geschichte. Oft wird dazu ein Bild angezeigt ( imshowin Python) - es kann zwei räumliche Dimensionen sowie eine dritte Farbdimension anzeigen.
Scott
@Scott: Ich stimme zu, dass der Begriff "Dimension eines Arrays" unglücklich ist, da er etwas bedeutet, das nichts mit der Dimension eines Raums zu tun hat, dessen Vektoren Sie möglicherweise durch die Arrays darstellen. (Ich halte es jedoch auch nicht für so eine gute Idee, Vektoren in erster Linie durch einfache, ungeteilte Arrays darzustellen.) Ein besserer Name könnte der Rang eines Arrays sein, in Analogie zu Tensoren .
links um den
13

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 nfaltbar ist. Das bedeutet

  • int x[4]sind 4 Blöcke, von denen jeder einen enthält int.
  • int x[5][4]sind 5 Blöcke, von denen jeder einen enthält int[4].
  • int x[3][5][4]sind 3 Blöcke, von denen jeder einen enthält int[5][4].
  • int x[2][3][5][4]sind 2 Blöcke, von denen jeder einen enthält int[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 letzten
  • ROW für den vorletzten
  • PAGE für den drittletzten

Bis hierher habe ich es irgendwo gelesen. Um hier zu bleiben, können wir auch definieren

  • BOOK für den viertletzten
  • und vielleicht SHELFfür den fünftletzten. (Oder, wenn Sie es vorziehen, SHELFROWdamit 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 .

glglgl
quelle
13

Stellen Sie sich ein eindimensionales Array wie eine Kommode vor:

Kommode

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.

Kevin Workman
quelle
4
Es sind Kommoden ganz unten, Mann.
Thomas Eding
8
Und in der letzten Kommode? Schildkröten .
Kevin Workman
Leicht pedantisch sein. Vorausgesetzt, es gibt 3 Schubladen in jeder Truhe (basierend auf dem Bild), nicht 4, und Sie verwenden einen Basis-0-Index, wäre die unterste Schublade 2, nicht 3. Also myArray[0][3]wäre es stattdessen myArray[0][2]. Ansonsten aber gute Erklärung.
Tom Heard
@TomHeard Die erste Kommode hat 3 Schubladen, aber die Kommode in der ersten Schublade hat 4 Schubladen. Duh! : p
Kevin Workman
1
Oh, dann ist das in Ordnung. = D
Tom Heard
5

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:

  • Frequenz - Farbe oder Tonhöhe
  • Masse
  • Wertigkeit
  • Farbe (Up-Quark, Down-Quark, fremder Quark, verzauberter Quark usw.)
  • Drehrichtung
  • Winkel
  • Lautstärke
  • Schärfe (von Chili)

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).

Peter
quelle
1
"Nicht alle Dimensionen sind räumlich." Bei Arrays, alle Maße sind räumlich.
Rhymoid
2
@ Rhymoid: Bei Arrays sind keine Dimensionen inhärent räumlich, wie wir über den Raum denken. : P Wir definieren sie so, dass sie repräsentieren, was wir wollen.
CHAO
@cHao Vielleicht, wenn Sie sich die Semantik der von ihnen gespeicherten Daten ansehen. Auf der Seite der Repräsentation, Syntax und Implementierung sind alle Array-Dimensionen von Natur aus räumlich. Genau darauf verlassen Sie sich, wenn Sie Arrays als Teil eines Algorithmus verwenden.
Rhymoid
@ Rhymoid: Das ist derselbe Denkprozess, der dazu geführt hat, dass diese Frage überhaupt erst gestellt wurde. Eine Dimension, die aufzählbar ist, macht sie nicht räumlich. Implementierungstechnisch ist kein Platz vorhanden. Es gibt nur Gedächtnis und Gedächtnis ist eindimensional, soweit ein Programm es kennt / sieht / kümmert.
CHAO
@cHao: umsetzungsmäßig gibt es platz, weil es auch zeit gibt. Der Begriff "Space Leak" (als Alternative zu "Memory Leak" in der Haskell-Community) ist kein Zufall. Die Tatsache, dass das Gedächtnis als eindimensional beschrieben wird, ist ein Erbe von BCPL.
Rhymoid
4

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.

Russell Borogove
quelle
"Wir gehen davon aus, dass jede räumliche Dimension unendlich ist" Unendlich ist hier eigentlich nicht das größte Problem. Kontinuierlich ist das "echte" Problem (dh unzählbar unendlich, und wir brauchen eine homöomorphe Abbildung, damit es physikalisch sinnvoll ist).
links um den
3

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.

Tom Au
quelle