À propos des tableaux multidimensionnels

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Voilà un sujet apparemment simple mais qui, en fait, ne l’est pas du tout.

Ici : Ce lien n'existe plus
j’ai trouvé la définition, disons, la « moins mauvaise ».

« Le terme français « tableau » est ambigu dans excel. Pour cette raison le terme array sera utilisé pour faire la distinction entre les tableaux, qui s’écrivent dans les feuilles de calcul, et les arrays qui sont des objets VBA.
Un array est un container qui permet de stocker de façon temporaire des données, de faire des calculs dessus ou de les trier si nécessaire, puis de les restituer dans une feuille de calcul. »

Je déclare un tableau (virtuel) à une dimension qui récupère, par exemple, les 10 lignes d’une colonne d’un tableau (physique) de la feuille : Tablo (9). Option Base 0 (on compte de 0 à 9 = 10). Je rajoute une autre dimension au tableau (virtuel), laquelle dimension correspondra aux colonnes du tableau de la feuille. Supposons que ce tableau (physique) ait 3 colonnes contiguës à la 1ère, j’imagine qu’en toute logique je devrais écrire selon le même raisonnement que précédemment : Tablo (9, 2).
Il semblerait qu’un tableau virtuel peut avoir jusqu’à 60 dimensions… Sans atteindre ce chiffre cosmique, je me suis demandé ce que pouvait déjà être une 3ème dimension. Peut-être une feuille, en partant du principe que dans chaque feuille il y ait un tableau similaire à Tablo (9, 2). Tablo (9, 2, 3) signifierait alors des tableaux de 10 lignes, 3 colonnes, chacun se trouvant dans 4 feuilles du classeur.
Mon raisonnement tient-il debout ?
Si oui (ou non), que signifie au juste un tableau de, par exemple, 5 dimensions ?
Existe-t-il quelque part des exemples concrets, non abscons, autrement dit intelligibles ?
Merci d’avance de m’éclairer.
 

jpb388

XLDnaute Accro
Re : À propos des tableaux multidimensionnels

Bonsoir le forum
pour la simulation on va prendre les comptes
le 1er chiffre representerait les années
le 2eme les mois
le 3eme total
soit
compte(0,0,0)=2012,total annuel,montant recette
compte(0,0,1)=2012,total annuel,montant depnse
compte(0,1,0)=2012,janvier,montant recette
compte(0,1,1)=2012,janvier,montant recette

compte(1,0,0)=2013,total annuel,montant recette
compte(1,0,1)=2013,total annuel,montant depnse
compte(1,1,0)=20132,janvier,montant recette
compte(1,1,1)=2013,janvier,montant recette

et si on rajoute les jours + les montants cela nous fait au moins 5 dimensions
je ne sais pas si cela va t'aider mais moi je vois les arrays dans cet optique
 

Magic_Doctor

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonsoir jpb388,

Je ne voudrais pas être péremptoire, mais j'ai comme un doute.
En suivant votre raisonnement, on rajoute l'âge du capitaine et ensuite celui de chacune de ses maîtresses pour chaque port d'escale et on pourrait facilement, suivant la vitalité du capitaine, atteindre les 60 dimensions...
Mais, ce qui m'a conduit à me poser des questions est la réflexion faite dans la page mentionnée dans mon 1er post :
"Un array peut contenir jusqu'à 60 dimensions contenant chacune un nombre variable d'éléments. Cela dit je n'ai encore jamais trouvé d'exemple pour illustrer ce type d'utilisation ! Dans la grande majorité des cas un array contient 1 et surtout 2 dimensions. Même l'utilisation d'arrays à 3 dimensions est très peu documentée."

Je pense que c'est plus tordu qu'il n'y paraît...
 
Dernière édition:

jpb388

XLDnaute Accro
Re : À propos des tableaux multidimensionnels

re
et pourtant c'est ça et au dela de 3 dimensions il ne faut pas perdre le fil audela de 5 je dirais (enfin pour moi) que c'est impossible a gérer
son avantage c'est la rapidité et tu peux traiter chaque élément indépendamment des autres
enfin je l'ai perçu comme ça
 

Modeste geedee

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonsour®
Mais, ce qui m'a conduit à me poser des questions est la réflexion faite dans la page mentionnée dans mon 1er post :
"Un array peut contenir jusqu'à 60 dimensions contenant chacune un nombre variable d'éléments. Cela dit je n'ai encore jamais trouvé d'exemple pour illustrer ce type d'utilisation ! Dans la grande majorité des cas un array contient 1 et surtout 2 dimensions. Même l'utilisation d'arrays à 3 dimensions est très peu documentée."

Je pense que c'est plus tordu qu'il n'y paraît...

on s'éloigne un peu ;) d'Excel ...
de façon terre à terre ...
exemple en volume : 3 dimensions c'est Hauteur, largeur, profondeur
une 4éme dimension serait le temps (passé, présent, avenir)

exemple en indexation littéraire : chapitre, paragraphe, ligne
une dimension plus grosse serait le livre
une dimension de plus fine serait le caractère
ce qui ferait 5 dimensions
en ajoutant étagère, rayon on arrive encore facilement a se représenter 7 dimensions
puis salle, bâtiment on atteint 9 dimensions.

Nous avons du mal à visualiser des dimensions supplémentaires car nous ne pouvons nous déplacer que dans trois dimensions spatiales. Et même alors nous ne voyons qu'en 2+1 dimensions ; la vision en 3 dimensions permettrait de voir toutes les faces d'un objet en même temps.(structure en fil de fer)

là : faut oublier excel !!! ;)
Théorie des supercordes - Wikipédia
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : À propos des tableaux multidimensionnels

Bonjour à tous,

On peut imaginer la gestion d'un parking à 4 étages (0 à 4)
Chaque étage ayant 6 rangées de voiture (1 à 6)
Chaque rangée ayant 25 places de stationnement.

Une place de stationnement pourrait être repérée par un triplet (étage, rangée, place).
On pourrait utiliser un tableau (0 to 4, 1 to 6, 1 to 25) par exemple.

Si la société de parking en possède 3 dans la ville, on peut rajouter une dimension correspondant au site dans la ville.
d'où: (1 to 3, 0 to 4, 1 to 6, 1 to 25)
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

C'est bien ce que je disais au départ : problème simple en apparence mais nettement plus compliqué quand on se penche critiquement dessus.
La réponse de mapomme me semble tout à fait pertinente et est, je pense, un bon exemple pour imaginer d'autres "dimensions" qui n'ont strictement rien à voir avec celles des relativistes. Après tout, VBA, aussi tordu soit-il parfois, est bien loin des univers obscurs (pour l'immense majorité du commun des mortels) des Poincaré et autres Einstein... Ce n'est, après tout, qu'un langage !
Plutôt que des dimensions stricto sensu, on devrait parler d'espèces de "tiroirs", ou mieux de matrioska.
 

Modeste geedee

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonsour®
C'est bien ce que je disais au départ : problème simple en apparence mais nettement plus compliqué quand on se penche critiquement dessus.
..//..
Plutôt que des dimensions stricto sensu, on devrait parler d'espèces de "tiroirs", ou mieux de matrioska.

c'est très réducteur !!! pour les matrioska on ne travaille que dans une seule dimension : la taille...
:rolleyes: Ce lien n'existe plus
 

Efgé

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonjour à tous

Etant toujours très Terre à Terre, je propose de penser Rubik's Cube.

Un tableau à une dimension est une ligne d'arrête horizntale du rubik's. Rub(1 to 3)

Un tableau à deux dimensions est une façe de rubik's Rub(1 to 3, 1 to3)
A noter que le dernier 1 to 3 représente toujours l'arrête horizontale du premier tablea
(trois lignes sur trois colonnes)

Un tableau à Trois dimentions est le rubik's entier Rub(1to 3, 1 to 3 1 to 3)
(Trois tableaux de trois lignes sur trois colonnes)

Un tableau à quatre dimensions : Rub( 1 to 2, 1 to 3, 1 to 3, 1 to 3) représente deux rubik's
(Deux cubes de trois tableaux de 3 lignes sur 3 colonnes)

La dernière valeur est toujours les colonnes, l'avant dernière les lignes....

Voila, voila....

Cordialement

EDIt Voir Ce lien n'existe plus pour un schéma à trois dimensions
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Re
Maintenant , et pour prendre un exemple plus parlant, passons à un entreprise:
J'ai trois usines de 6 machines chacunes.

Je veux entrer la production quotidienne de chaque machine dans un tableau multidimentionnel.

J'ai besoin de
12 mois
31 jours par mois
6 machines
3 usines

Je fais Tableau ( Usines, Machines, Jours, mois)
Tableau (1 to 3 , 1 to 6, 1 to 31, 1 to 12)

Je retrouve trois cubes (1 to 3) mes usines
De six tableaux chacun (mes machines)
Chaque tableau à 31 lignes (les jours)
Chaque tableau à 12 colonnes (les mois)

Si je m'agrandis en ouvrant 3 usines de 6 machines à l'étranger, je peux continuer:
Tableau( 1 to 2,1 to 3 , 1 to 6, 1 to 31, 1 to 12)
Avec 1 to 2 pour pays_1 pays_2

On pourra imaginé des ouvertures sur des planètes décentralisées, ou la main d'oeuvre est moin chère grâce aux douzes bras des habitants...

Cordialement
 

Misange

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonjour

Dès lors que l'on peut écrire dans une feuille un tableau avec un item en colonne A et ses n caractéristiques en colonnes B, C... , il ne s'agit pas d'un tableau à n dimensions mais d'un tableau 2D, même si n est très grand.

Le tableau 3D dans excel peut s'écrire en répétant la même structure de tableau sur N feuille. (on retombe dans l'image du cube et de la visualisation dans l'espace).
Il peut aussi s'écrire sur une seule feuille en utilisant une structure arborescente de ce type

item
param 1valeur
1111
222
333
2155
288
377
3145
256
387

on peut ajouter une dimension (paramètre 2) en répétant param 1 pour toutes les valeurs possibles de ce param 2 et ainsi de suite. Cette façon de le représenter revient en quelque sorte à l'aplatir. Ca nous le rend en tous cas compréhensible (enfin à moi en tous cas !).

6 valeurs pour un item ne veut pas nécessairement dire 6 dimensions :
On pourrait par exemple mesurer la température (t) et la pression (p) en chaque point (x, y) d'un terrain, en fonction du temps (M) et de l'altitude (Y) car ce terrain est en pente.
Si on a une relation constante entre la température et la pression, on n'a pas 6 mais 5 dimensions : il n'est pas nécessaire de mesurer chaque pression pour chaque température, quand bien même on écrit la valeur de la pression dans une nouvelle colonne.
En revanche si la température et la pression ne varient pas de façon corrélée, ou qu'on veuille prouver que c'est le cas en portant en chaque point et pour chaque altitude et chaque temps (X, Y, Z, M) la température et la pression, là on a bien 6 dimensions.


On voit tout de suite que la taille d'un tableau à N dimensions augmente très rapidement si le nombre de dimension est grand.
Un tableau à 60 dimensions dont chacune accepterait seulement 2 valeurs devrait s'écrire sur 2 puissance 60 lignes soit 1.15 e18 !
on arrive très vite au delà du nombre de lignes possible dans notre cher tableur, même avec powerpivot !


Les tableaux croisés dynamiques font très bien l'analyse de ce type de tableau (en répétant toutes les valeurs qui doivent l'être) pour autant qu'on reste dans les limites du nmbre de lignes.
Les arrays sont plus rapides pour manipuler les données en VBA que les boucles mais les capacités d'excel (et du PC qui l'héberge) ne sont pas illimitées quand même.
 

Modeste geedee

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonsour®
Les tableaux croisés dynamiques font très bien l'analyse de ce type de tableau (en répétant toutes les valeurs qui doivent l'être) pour autant qu'on reste dans les limites du nmbre de lignes.
Les arrays sont plus rapides pour manipuler les données en VBA que les boucles mais les capacités d'excel (et du PC qui l'héberge) ne sont pas illimitées quand même.

:rolleyes:
voilà qui nous ramène à Excel et la similitude des tableaux croisés(2 dimensions) avec les hypercubes OLAP
et l'analyse multidimensionnelle (vaste sujet... :rolleyes:)

dans une base de données relationnelle, il y a plusieurs tables,
chaque table est caractérisée par une ou plusieurs clés
si pour chaque table on peut trouver une clé commune(primaire ou secondaire)
alors on peut construire un "hypercube" OLAP
comportant autant de dimensions que de tables possédant cette clé commune.

les outils décrits par Mr CODD Online Analytical Processing - Wikipédia
permettent alors pour une clé définie, d'extraire dans chaque table les éléments souhaités dans un vecteur à n dimensions (n est le nombre de tables)
chaque élément du vecteur pouvant lui-même etre un "array" comportant X éléments de "la table" concernée.
 

ROGER2327

XLDnaute Barbatruc
Re : À propos des tableaux multidimensionnels

Bonjour à tous.


Amusante discussion !

Un exemple de tableau à quatre dimensions devrait clarifier les choses...

Dans le classeur joint, 48 feuilles (onglets 2010-1, 2010-2, ..., 2013-12) recensent un relevé d'une grandeur heure par heure. Pour lire le relevé du 12 novembre 2012 à 10 heures, on écrira classiquement :
Code:
x = Sheets("2012-11").Range("L13").Value
Si l'on souhaite établir un tableau par année de la moyenne journalière des relevés (onglets jaunes), c'est un joyeux bordel.

Heureusement, le tableau à quatre dimensions existe ! Si l'on écrit
VB:
    For Année = 2010 To 2013: For Mois = 1 To 12: For Jour = 1 To 31: For Heure = 0 To 23
        Données(Année, Mois, Jour, Heure) = Sheets(CStr(Année) & "-" & Mois).Cells(1, 2).Offset(Jour, Heure).Value
    Next Heure, Jour, Mois, Année
on regroupe toutes les données des onglets 2010-1, 2010-2, ..., 2013-12 dans un seul tableau dont les dimensions sont Année, Mois, Jour, Heure. Lire un quelconque des relevés, par exemple celui du 12 novembre 2012 à 10 heures est un jeu d'enfant :
VB:
x = Données(2012, 11, 12, 10)
C'est plus intuitif que :
VB:
x = Sheets("2012-11").Range("L13").Value
Le remplissage des onglets jaunes évoqués plus haut se fait simplement par :
VB:
    For Année = 2010 To 2013
        For Mois = 1 To 12: For Jour = 1 To 31
            For Heure = 0 To 23
                If Not IsEmpty(Données(Année, Mois, Jour, Heure)) Then
                    Compteur = Compteur + 1
                    Moyenne(Jour, Mois) = Moyenne(Jour, Mois) + Données(Année, Mois, Jour, Heure)
                End If
            Next Heure
            If Compteur Then Moyenne(Jour, Mois) = Moyenne(Jour, Mois) / Compteur: Compteur = 0
        Next Jour, Mois
        Sheets(CStr(Année)).Cells(2, 2).Resize(31, 12).Value = Moyenne
        Erase Moyenne
    Next Année


Code du classeur joint :
VB:
Option Base 0

Sub Traitement()
Dim Année%, Mois%, Jour%, Heure%, Compteur&, Données(2010 To 2013, 1 To 12, 1 To 31, 23)
Dim Moyenne(1 To 31, 1 To 12), Minimum(1 To 31, 1 To 12), Maximum(1 To 31, 1 To 12)

'Chargement des données dans un tableau à quatre dimensions.

    For Année = 2010 To 2013: For Mois = 1 To 12: For Jour = 1 To 31: For Heure = 0 To 23
        Données(Année, Mois, Jour, Heure) = Sheets(CStr(Année) & "-" & Mois).Cells(1, 2).Offset(Jour, Heure).Value
    Next Heure, Jour, Mois, Année

'Cela fait, on peut faire rapidement tous les traitements qu'on veut sur les 35 712 données
'(onglets 2010-1 à 2013-12) sans avoir besoin de lire quoi que ce soit dans le classeur.
'Chaque donnée est identifiée par : Données(Année, Mois, Jour, Heure).
'Par exemple, établissement des tableaux annuels de moyennes quotidiennes (onglets jaunes):

    For Année = 2010 To 2013
        For Mois = 1 To 12: For Jour = 1 To 31
            For Heure = 0 To 23
                If Not IsEmpty(Données(Année, Mois, Jour, Heure)) Then
                    Compteur = Compteur + 1
                    Moyenne(Jour, Mois) = Moyenne(Jour, Mois) + Données(Année, Mois, Jour, Heure)
                End If
            Next Heure
            If Compteur Then Moyenne(Jour, Mois) = Moyenne(Jour, Mois) / Compteur: Compteur = 0
        Next Jour, Mois
        Sheets(CStr(Année)).Cells(2, 2).Resize(31, 12).Value = Moyenne
        Erase Moyenne
    Next Année

'Ou valeurs quotidiennes moyennes, minimales,maximales, pour la période 2010 à 2013 (onglets bleus):

    For Mois = 1 To 12: For Jour = 1 To 31
        Minimum(Jour, Mois) = 1.79769313486231E+308
        Maximum(Jour, Mois) = -1.79769313486231E+308
        For Année = 2010 To 2013: For Heure = 0 To 23
            If Not IsEmpty(Données(Année, Mois, Jour, Heure)) Then
                Compteur = Compteur + 1
                Moyenne(Jour, Mois) = Moyenne(Jour, Mois) + Données(Année, Mois, Jour, Heure)
                If Minimum(Jour, Mois) > Données(Année, Mois, Jour, Heure) Then Minimum(Jour, Mois) = Données(Année, Mois, Jour, Heure)
                If Maximum(Jour, Mois) < Données(Année, Mois, Jour, Heure) Then Maximum(Jour, Mois) = Données(Année, Mois, Jour, Heure)
            End If
        Next Heure, Année
        If Compteur Then Moyenne(Jour, Mois) = Moyenne(Jour, Mois) / Compteur: Compteur = 0 Else Minimum(Jour, Mois) = Empty: Maximum(Jour, Mois) = Empty
    Next Jour, Mois
    Sheets("moyenne").Cells(2, 2).Resize(31, 12).Value = Moyenne
    Sheets("minimum").Cells(2, 2).Resize(31, 12).Value = Minimum
    Sheets("maximum").Cells(2, 2).Resize(31, 12).Value = Maximum
    Erase Moyenne, Minimum, Maximum

'Ou autre chose :

'Code
'Code
'Code

    Erase Données

End Sub
Difficiles les tableaux de dimension supérieure à deux ? Allons donc !​



Bonne nuit !


ROGER2327
#6670


Vendredi 27 Merdre 140 (Saints Courts et Longs, gendarmes - fête Suprême Quarte)
25 Prairial An CCXXI, 0,5269h - tanche
2013-W24-4T01:15:53Z
 

Pièces jointes

  • XLD_207111_Tableau à quatre dimensions.xlsm
    540.6 KB · Affichages: 78
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 391
Messages
2 087 985
Membres
103 690
dernier inscrit
LeDuc