lundi 19 novembre 2007

Tableau 2D en Ruby

Aujourd'hui, je vous propose une classe implémentant des tableaux bidimensionnels. Les tableaux sont très bien gérés en Ruby, mais j'ai déjà eu besoin de quelque chose d'à la fois simple à utiliser et assez évolué pour des applications scientifiques par exemple.

Le fichier Table.rb contenant la classe est un peu long pour l'exposer ici : je vous propose de le télécharger ici (150 lignes environ).

Passons le rapidement en revue (petite astuce pour générer la doc associée : placez vous dans le répertoire où il se trouve et en ligne de commande tapez : rdoc. Cela génèrera automatiquement sa doc en HTML.).

Hormis les fonctions de base (initialisation, copie, accès aux cases du tableau, to_string et affichage console), il y a 3 méthodes un peu spéciales :

  • write_to_f génère 2 fichiers de sortie : un similaire à l'affichage console (.dat), et un autre destiné à être lu par gnuplot (ou éventuellement un autre programme de courbes acceptant ce format) dans le cas d'un tableau contenant des variables numériques.
  • Les BC (pour Boundary Conditions = Conditions aux limites en français) qui jouent sur la fonction suivante.
  • neighbours renvoie la liste des cellules "voisines" de la cellule ciblée. Le terme "voisin" dépendant des conditions aux limites.
Au départ, j'avais créé cette classe pour des applications avec automates cellulaires (jeu de la vie, etc...) : cette fonction y est très utile pour modéliser les différents types de BC. Pour résumer, en Ruby, par défaut, les tableaux sont cycliques (ou "périodiques"), exemple :

a = [0, 1, 2, 3]
a[-1]
#=> 3
Et donc par défaut, les BC transmettent les infos d'un bord à l'autre. Mais on peut vouloir envisager son tableau comme une boîte fermée (:closed) ou comme une carte du monde (:realistic_map ; on transmet en Est-Ouest, mais pas en Nord-Sud).

Pour tester rapidement cette classe :
require 'Table'

a = Table.new 3, 4, 45

a.[]=(1,1,2)

a.print

puts a.BC.to_s


On crée un tableau de 3 lignes et 4 colonnes rempli de 45. Puis, on affecte à la case de la seconde ligne et seconde colonne la valeur 2 (en Ruby comme en C et C++, les premières cases sont indexées par 0, par défaut.). On affiche le tableau, puis ses conditions aux limites.

La classe n'est pas optimisée, ni totalement sécurisée, et beaucoup de méthodes utiles sont envisageables (produit matriciel, min, max...). L'intérêt c'est qu'elle est facilement modifiable et utilisable tout de suite pour de petites applis.

2 commentaires:

Lefty a dit…

ouais...c'est pas faux.
le côté agricole n'est pas gênant, il n'est pas redondant.
j'ai rencontré un vieux qui m'en a parlé, il trouvait ça fastueux.
...sont cons, ces vieux

Sobe a dit…

Mise à jour des liens vers Pastie.
Merci à Daidalos pour l'info.