Résumé:
Donc, si je comprends bien (bien que ma compréhension soit très limitée), il y a trois dimensions avec lesquelles nous travaillons (habituellement) physiquement:
Le 1er serait représenté par une ligne.
Le 2e serait représenté par un carré.
Le 3ème serait représenté par un cube.
Assez simple jusqu'à ce que nous arrivions au 4th - Il est un peu difficile de dessiner dans un espace 3D, si vous voyez ce que je veux dire ... Certaines personnes disent qu'il a quelque chose à faire avec le temps .
La question:
Maintenant, même si cela n'a pas beaucoup de sens, c'est très bien avec moi. Ma question n'est pas à ce sujet, ou je la poserais sur MathSO ou PhysicsSO. Ma question est: Comment l'ordinateur gère-t-il cela avec les tableaux?
Je sais que vous pouvez créer des tableaux 4D, 5D, 6D, etc ... dans de nombreux langages de programmation différents, mais je veux savoir comment cela fonctionne.
Heureusement, les programmes ne sont pas limités par les contraintes physiques du monde réel. Les tableaux ne sont pas stockés dans l'espace physique, donc le nombre de dimensions du tableau n'a pas d'importance. Ils sont aplatis en mémoire linéaire. Par exemple, un tableau unidimensionnel avec deux éléments peut être présenté comme suit:
(0) (1)
Un tableau dimensionnel 2x2 pourrait alors être:
(0,0) (0,1) (1,0) (1,1)
Un tableau tridimensionnel 2x2x2 peut être:
(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) (1,0,1) (1,1,0) (1,1,1)
Vous pouvez, espérons-le, voir où cela va. Quatre dimensions peuvent être:
(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)
Vous n'avez pas besoin d'imaginer dans des dimensions spatiales élevées, pensez simplement à une feuille de fougère.
La tige principale est votre premier tableau, chaque branche étant un élément qu'elle stocke. Si nous regardons une branche, c'est votre deuxième dimension. Il a une structure similaire de branches plus petites venant de lui représentant ses données. Ceux-ci ont à leur tour leurs propres petites branches qui se poursuivent jusqu'à ce que nous arrivions aux minuscules feuilles représentant les données du tableau de dimension intérieure la plus élevée ou la plus élevée.
Vous pouvez voir cette construction s'accumuler si vous déclarez chaque niveau avec son propre nom. Ici, je réutilise chaque niveau variable pour minimiser le code:
leaf = 2;
tinyBranch = [leaf, leaf, leaf];
middleBranch = [tinyBranch, tinyBranch, tinyBranch];
bigBranch = [middleBranch, middleBranch, middleBranch];
mainBranch = [bigBranch, bigBranch, bigBranch];
Les dimensions sont ce que vous voulez être, la 4ème dimension ne doit pas nécessairement être le temps. Si vous pensez à trois dimensions comme un cube, vous pouvez penser à 4 dimensions comme une rangée de cubes. 5 dimensions, une grille de cubes, etc.
Vous pouvez également avoir une collection 3D de voxels, avec une 4ème dimension étant la couleur, la densité ou une autre propriété.
Lorsque vous allouez la mémoire pour votre tableau multidimensionnel, il alloue simplement le produit de chaque dimension maximum pour votre type de données. Si vous avez un tableau 3D ou un "cube" de 10 éléments dans chaque dimension, vous aurez 1 000 éléments alloués. Si vous créez un tableau 4d avec 10 éléments dans la 4e dimension, l'ordinateur allouera simplement 10 000. Augmentez-le jusqu'à 5 dimensions et il en allouera 100 000.
L'ordinateur ne se soucie d'aucune sorte de signification sur ce que représente chaque dimension. Pour sélectionner où se trouve un seul point dans la liste des éléments, il suffit de multiplier pour sélectionner une adresse mémoire.
Imaginez faire de la R&D sur un nouveau dispositif médical, une série de capteurs que vous placez le long des bras d'un patient. Vous avez sept volontaires alignés pour le test. Chaque capteur signale des lectures basse fréquence, moyenne fréquence et haute fréquence, que vous prenez toutes les 100 ms pendant environ une minute.
Comment stocker toutes ces données en mémoire pour l'analyse et le traçage?
Un tableau, évidemment. Cela ressemblerait à ceci (en utilisant un pseudocode générique composé):
npatients = 7
nsensors = 4 // number of sensors on an arm
nchannels = 3
nsamples = 60.0 / 0.1
sensordata = Array[ npatients, nsensors, 2, nchannels, nsamples ]
C'est un tableau à cinq dimensions, et il n'y a rien de délicat, mystérieux ou déroutant à ce sujet. Il n'y a aucune raison d'essayer de l'associer à l'espace euclidien à 5 dimensions. Pour obtenir une valeur de données, nous utilisons une expression comme
x = sensordata[6, 5, 1, 2, 338)
Cela revient à interroger une base de données relationnelle où vous avez un enregistrement pour chaque valeur de données, avec cinq colonnes contenant l'ID du patient, l'ID du capteur, etc., et une colonne avec la valeur. Pour obtenir un point de données, utilisez cinq termes dans WHERE: SELECT value FROM SensorData WHERE (patientid = 6) and (sensorid = 5) and (arm = "left") and (channel = "midfreq") and (sampleindex = 338 ).
Il n'y a rien de mystique dans une table de base de données avec cinq colonnes ou plus, n'est-ce pas?
(J'utilise l'indexation basée sur 1, mais dans la vie réelle, la base 0 est beaucoup plus courante.)
Notez que je suis un mauvais garçon en raison du codage en dur du nombre d'armes. Si je reçois un financement pour enquêter sur ces capteurs sur une pieuvre, j'ai des ennuis!
Un tableau n'est qu'un bloc de mémoire continue. L'adressage de la mémoire est unidimensionnel, vous pouvez avancer ou reculer. Donc, en supposant que vous ayez un tableau à 5 éléments, 5 blocs de mémoire seront réservés. Si vous avez un tableau à 2 dimensions avec 5 éléments dans chaque dimension, 25 blocs de mémoire seront réservés.
... ou je le demanderais sur MathSO ...
Eh bien, en fait, les mathématiciens n'associeraient jamais (ou du moins pas habituellement) une quatrième dimension à quelque chose comme le temps. Ils n'associeraient pas non plus les trois premiers à quelque chose comme: les mathématiciens définissent simplement la dimension comme une propriété abstraite, généralement, un espace vectoriel (souvent cela sera généralisé à variétés ou même les espaces métriques ). Et cette définition abstraite ne se soucie pas du nombre de dimensions de l'espace physique dans lequel nous nous déplaçons. Le concept de dimensions s'applique aux espaces qui ne ressemblent même pas à l'espace physique. En fait, les mathématiciens (et même les physiciens) utilisent très souvent des espaces de dimension infinie , tels que les espaces de Hilbert de la mécanique quantique.
Cela étant clarifié, parlons de tableaux - vous n'avez pas besoin de comprendre les espaces vectoriels, car la définition abstraite est en fait beaucoup plus simple ici.
Un ( ℓ × ℓ 1 × ℓ 2 × ... × ℓ n - 1tableau de taille (c'est-à-dire de dimension n ) est simplement une collection de ℓ ⋅ ℓ 1 ⋅ ... ⋅ ℓ n - 1 nombres (ou tout autre type d'objet remplit le tableau). La seule différence avec un tableau unidimensionnel de cette longueur est que vous avez un moyen particulièrement utile d'indexer les dimensions séparément, à savoir
i lin = i n - 1 + ℓ n - 1 ⋅ ( i n - 2 + ℓ n - 1 ⋅ (... ℓ 2 ⋅ ( i 1 + ℓ 1 ⋅ i ) ...))
Imaginez un tableau unidimensionnel comme une commode:
Chaque tiroir est un index du tableau. Vous pouvez mettre ce que vous voulez dans chaque tiroir, et à de nombreuses fins, chaque tiroir ne contiendra qu'un seul élément (c'est un tableau unidimensionnel).
Cette commode est magique, elle n'est donc pas limitée par l'espace physique. Cela signifie que vous pouvez mettre ne autre commode à l'intérieur de chaque tiroir de la première commode. Les coffres intérieurs des tiroirs peuvent alors contenir tout ce que vous voulez. C'est un tableau à deux dimensions.
Vous pouvez donc dire quelque chose comme "ouvrez le tiroir supérieur de la première commode, sortez la commode de ce tiroir, puis ouvrez le tiroir inférieur de cette deuxième commode". Ce serait comme accéder à un index d'un tableau 2D: myArray [0] [3];
Et bien sûr, les commodes à l'intérieur de la commode la plus extérieure peuvent elles-mêmes contenir des commodes. C'est un tableau en trois dimensions.
Donc, votre question est: qu'est-ce qu'un tableau à quatre dimensions? C'est une commode à tiroirs de commodes à tiroirs de commodes à tiroirs de commodes, bien sûr!
Ce sont des tiroirs tout en bas.
En programmation, les tableaux sont assez faciles à implémenter, mais peut-être pas à comprendre.
Généralement, chaque niveau de tableaux signifie avoir le contenu n
- fold. Cela signifie
int x[4]
sont 4 blocs, chacun contenant un int
.int x[5][4]
sont 5 blocs, chacun contenant un int[4]
.int x[3][5][4]
sont 3 blocs, chacun contenant un int[5][4]
.int x[2][3][5][4]
sont 2 blocs, chacun contenant un int[3][5][4]
.La façon dont vous vous référez à eux dépend de vous, mais pour une meilleure compréhension, vous avez quelque chose comme
COLUMN
pour le dernierROW
pour l'avant-dernierPAGE
pour l'avant-dernierJusqu'ici, je l'ai lu quelque part. Pour rester ici, on peut aussi bien définir
BOOK
pour l'avant-dernierSHELF
pour l'avant-dernier. (Ou, si vous préférez, SHELFROW
pour que nous puissions continuer.)Cela dit, je n'ai jamais vu de tableau avec plus de 4 ou peut-être 5 dimensions dans la "vie sauvage".
De cette façon, vous pouvez définir et imaginer int x[6][2][3][5][4]
comme une collection de 6 "étagères", chacune ayant 2 livres, chacun ayant 3 pages, chacun ayant 5 rangées, chacune ayant 4 colonnes.
La plupart des aspects de cette question ont déjà été pris en compte, mais je pense que cela aidera si vous considérez la nature d'une dimension. Toutes les dimensions ne sont pas spatiales. Une dimension est un contexte de mesure. Voici quelques exemples:
La "quatrième" dimension n'est que quatrième car il existe trois dimensions spatiales. L'espace et le temps occupent une place importante, car ils occupent une place importante. Très en face. Mais toute qualité quantifiable et mesurable peut être une dimension si vous la mesurez.
Par exemple, les soutiens-gorge ont trois dimensions: la taille de la tasse, la taille de la poitrine et l'interstitiel (je ne sais pas comment vous appelez les filles, mais je veux dire la distance entre les bonnets).
En physique, nous supposons que chaque dimension spatiale est infinie, ce qui rend la recherche d'espace pour de nouvelles dimensions assez difficile.
Lorsqu'il s'agit de tableaux finis, il est facile de trouver de l'espace.
Imaginez une feuille de papier avec une grille imprimée dessus; vous pouvez écrire des informations dans chaque cellule de la grille. C'est un tableau 2D: ligne et colonne.
Mettez plusieurs de ces feuilles de papier dans un dossier de fichiers; c'est un tableau 3D: page, ligne et colonne.
Mettez plusieurs de ces dossiers dans une boîte de fichier. Tableau 4D: dossier, page, ligne, colonne.
Disposez les boîtes dans une grille rectangulaire sur une palette en bois. Tableau 6D: boîte-ligne, boîte-colonne, dossier, page, ligne, colonne.
Empilez plus de grilles de boîtes par-dessus. Tableau 7D: profondeur de boîte, ligne de boîte, colonne de boîte, dossier, page, ligne, colonne.
Commencez à entasser des palettes dans un conteneur d'expédition: matrice 9D. (En supposant que chaque pile est aussi haute que l'intérieur du conteneur, vous ne pouvez donc obtenir que 2 dimensions supplémentaires ici.)
Empilez des conteneurs d'expédition sur le pont d'un porte-conteneurs: matrice 12D.
Votre flotte de porte-conteneurs est désormais un réseau 13D.
Dans le système de coordonnées cartésiennes, vous avez les axes x et y sur un plan. Vous pouvez représenter n'importe quel nombre sur le plan comme (x, y).
Dans trois "espaces" (autrement connu sous le nom de cube), vous pouvez avoir les axes x, y et z. Vous pouvez représenter n'importe quel élément du cube sous la forme (x, y, z).
Dans un espace multivarié, vous pouvez avoir les axes x, y, z et, w (où l'axe w est "imaginaire"). Vous pouvez représenter n'importe quel élément de cet espace comme (x, y, z, w).
Tous ces points dans l'espace sont désignés par des vecteurs. Dans quatre espaces, vous pouvez avoir deux vecteurs, où v1 = (x1, y1, z1, w1) et v2 = (x2, y2, z2, w2) . Ensuite, vous manipulez ces vecteurs comme vous le feriez avec des nombres. Par exemple, la somme des deux vecteurs, v1 + v2 serait (x1, y1, z1, w1) + (x2, y2, z2, w2). Ensuite, vous ajoutez ces vecteurs terme par terme comme vous le feriez pour les nombres, pour obtenir: (x1 + x2, y1 + y2, z1 + z2, w1 + w2).
Votre programme définira les vecteurs à l'aide de tableaux appropriés, puis effectuera des opérations arithmétiques sur eux dans l'ordre approprié.