Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tableau à n dimensions

9 réponses
Avatar
fraction
Bonjour.
Je ne sais d=E9clarer ni une liste dont le nombre d'=E9l=E9ments est
variable, ni un tableau dont le nombre de dimensions est variable.
Pour ce dernier probl=E8me, j'ai pens=E9 =E0 cr=E9er un tableau sur Excel e=
n
2D, qui croit en fonction du nombre de dimension. Mais =E7a me semble
difficile =E0 g=E9rer.
Plus philosophiquement, pensez-vous que le nombre de dimensions d'un
probl=E8me donn=E9 soit une limite th=E9orique =E0 l'IA ?

9 réponses

Avatar
Jean-marc
fraction wrote:
Bonjour.



Hello,

Je ne sais déclarer ni une liste dont le nombre d'éléments est
variable,



Ca, c'est facile - Redim et Redim Preserve.
Voir :
http://faq.vb.free.fr/index.php?question3
http://faq.vb.free.fr/index.php?question0

ni un tableau dont le nombre de dimensions est variable.



Ca, c'est un problème mal posé - Ce n'est pas une question de
langage, c'est un problème de modélisation.

Si tu y réfléchis, tu verras que pouvoir disposer d'un tableau
dont le nombre de dimensions n'est pas connu à l'avance ne
t'avance à rien.

Plus simplement, tout peut se ramener à un tableau à une dimension
dont les éléments peuvent eux même être des tableaux dont les
élements peuvent eux même être des tableaux, etc.

Bête exemple:
Option Explicit

Private Type b
c(10) As Integer
End Type

Dim a(10) As b

Private Sub Form_Load()
a(1).c(3) = 666
End Sub

a est un tableau à une dimension, chaque élément de a est un autre
tableau a 10 dimensions.

Il n'y a pas de limites à ce genre de déclarations. Et bien sur, a et b
peuvent eux même être dynamiques, alloués et désalloués avec Redim.

[Note: si il le fallait vraiment, je saurais écrire un programme qui
manipule un tableau "dont le nombre de dimensions est variable". Ca
n'aurait pas d'intérêt, mais c'est faisable.]

Plus philosophiquement, pensez-vous que le nombre de dimensions d'un
problème donné soit une limite théorique à l'IA ?



Absolument pas :-) On sait déclarer des tableaux à autant de "dimensions"
que l'on veut, c'est simplement une question de choix de structures de
données.

(Note bien que l'IA est un sujet extrèmement vaste, et que derrière le sigle
se cache des milliers de réalité différente, allant de la programmation
génétique au data mining, de la "compréhension" du langage naturel aux
applications des réseaux de neurones, et j'en passe et des meilleures. Mais
aucune des branches de l'IA ne bloque sur un problème de représentation
des "dimensions".)

Si tu es intéressé par le sujet, je te recommande vivement un excellent
livre
bourré d'exemples pratiques : "AI Application Programming -2nd Edition",
Par M.Tim Jones, chez Charles River Media.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
Jean-marc wrote:
fraction wrote:
Bonjour.
a est un tableau à une dimension, chaque élément de a est un autre


tableau a 10 dimensions.



Je voulais dire bien sur: "chaque élément de a est un autre
tableau a 1 dimension".
A() est un tableau à une dimension de 10 éléments. Chanque élément
de a() est un tableau à une dimension de 10 éléments.

A est donc ici isomorphe à un tableau à 2 dimensions ayant 10 élements
par dimension que l'on pourrait écrire:
Dim a(10, 10)

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
fraction
Merci.
J'ai compris comment déclarer un tel tableau. Mais il me manque de
savoir comment renvoyer une valeur donnée de ce tableau (sans
connaître n).
Exemple : a(1).b(1)...n(1)
Avatar
Jean-marc
fraction wrote:
Merci.
J'ai compris comment déclarer un tel tableau. Mais il me manque de
savoir comment renvoyer une valeur donnée de ce tableau (sans
connaître n).
Exemple : a(1).b(1)...n(1)



Ce n'est pas possible - C'est un problème de structure de données.

Est ce que ce qui t'intérrèsse, ca ne serait pas plutot un
arbre ?
http://fr.wikipedia.org/wiki/Catégorie:Arbre_(structure_de_données)

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
fraction
> > Exemple : a(1).b(1)...n(1)

Ce n'est pas possible - C'est un problème de structure de données.



Même si n est connu lors de l'exécution (en redimensionnant un objet
ou un variant qui contient le tableau par exemple) ?


Est ce que ce qui t'intérrèsse, ca ne serait pas plutot un
arbre ?http://fr.wikipedia.org/wiki/Catégorie:Arbre_(structure_de_donn ées)



Ça m'intéresse aussi, mais pour d'autres raisons. J'aurais
éventuellement besoin de définir un arbre causal (type arbre
généalogique).
Avatar
Jean-marc
fraction wrote:
Exemple : a(1).b(1)...n(1)



Ce n'est pas possible - C'est un problème de structure de données.



Même si n est connu lors de l'exécution (en redimensionnant un objet
ou un variant qui contient le tableau par exemple) ?



Non, en tout cas pas sous cette forme.

Ce qu'il est possible de faire [en supposant que ça ait un
sens, ce qui n'est pas le cas] c'est de déclarer un tableau
à une dimension (en gros, c'est juste de la mémoire que tu
alloues) et de dynamiquement décider de la structure.

L'idée générale est la suivante:
Imaginons que je veuille représenter une matrice (10,10).
c'est donc un tableau à 2 dimensions, de 10 éléments dans
chaque dimension.
Je peux en VB déclare ça:
Dim a(10, 10)

Mais en fait, ça traduit juste un besoin de 100 cases mémoires.
Je peux donc tout aussi bien déclarer:
Dim a(100)

Du coup, je peux décider que pour faire référence à la case mémoire
correspondant aux coordonnées (x,y), j'accède à l'élément
a((x-1)*10 + y)
ou encore (c'est purement arbitraire): a(x + (y-1)*10)

Tu peux généraliser ça à un usage à N dimensions, avec n inconnu.

Tu peux même faire varier N au cours du temps, avec à la clef un
amusant problème de relocation des données ...

Je précise que tout ça n'a aucun intérêt: en pratique, un programme
doit savoir à l'avance ce qu'il manipule.

[ca rappelle les questions que nous avons de temps en temps sur
"comment créer dynamiquement une variable" : c'est un non-sens,
puis que si cela était possible, il faudrait alors que le programme
génère aussi dynamiquement du code pour utiliser cette nouvelle
variable ...]

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
fraction
> Tu peux même faire varier N au cours du temps, avec à la clef un
amusant problème de relocation des données ...



Je ne suis pas d'accord avec le mot "amusant". :-)
J'ai une propriété d'objet à étudier. Sa valeur de vérité (ou
d'existence) dépend de la valeur de vérité de n autres propriétés . Je
veux que mon déducteur me donne toutes les combinaisons possibles. Et
je ne trouve pas ça "amusant". :-)
Avatar
fraction
On 18 oct, 15:42, fraction wrote:
> Tu peux même faire varier N au cours du temps, avec à la clef un
> amusant problème de relocation des données ...

Je ne suis pas d'accord avec le mot "amusant". :-)
J'ai une propriété d'objet à étudier. Sa valeur de vérité (ou
d'existence) dépend de la valeur de vérité de n autres propriét és. Je
veux que mon déducteur me donne toutes les combinaisons possibles. Et
je ne trouve pas ça "amusant". :-)



Ça y est, je crois avoir trouver. Etant donné qu'il n'y a que deux
valeurs, 0 et 1 (je gèrerais les contradictions après), il suffit de
convertir les coordonnées en chaîne binaire inversée (plus 1).
a(1).b(1).c(0) se transforme en 011=3 (plus un) égal 4.
Le dimensionnement est facile, c'est 2^(nombre de propriétés).
Avatar
Jean-marc
fraction wrote:
On 18 oct, 15:42, fraction wrote:
Tu peux même faire varier N au cours du temps, avec à la clef un
amusant problème de relocation des données ...



Je ne suis pas d'accord avec le mot "amusant". :-)
J'ai une propriété d'objet à étudier. Sa valeur de vérité (ou
d'existence) dépend de la valeur de vérité de n autres propriétés. Je
veux que mon déducteur me donne toutes les combinaisons possibles. Et
je ne trouve pas ça "amusant". :-)



Ça y est, je crois avoir trouver. Etant donné qu'il n'y a que deux
valeurs, 0 et 1 (je gèrerais les contradictions après), il suffit de
convertir les coordonnées en chaîne binaire inversée (plus 1).
a(1).b(1).c(0) se transforme en 011=3 (plus un) égal 4.
Le dimensionnement est facile, c'est 2^(nombre de propriétés).



Voila qui semble d'un coup beaucoup plus raisonnable.
Astuce pour parcourir toutes les combinaisons possibles : il suffit
de "compter" de 0 à (2^n)-1 et de regarder la valeur en base 2.
Ainsi, si on a 3 propriétés:
2^3-1 = 8-1 = 7
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

On n'a pas non plus forcément besoin de passer par une chaine,
il suffit bien souvent de garder un nombre puis de jouer avec
les masques binaires et les opérateurs (bitwise) AND et OR.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;