Accueil - Informatique - Programmation - Langages

Hashtable : utiliser les tableaux associatifs avec Matlab

Publié le samedi 7 février 2009.


Dernière mise à jour : 20/03/2009


Introduction


Les tableaux associatifs ou hashages sont une fonctionnalité très puissante et utile en programmation mais fort peu connue et utilisée dans le développement d’applications scientifiques.

Un tableau associatif est une structure de données ou les éléments (données de type quelconques) sont associés à une clé unique (chaines de caractères).

Contrairement à un tableau classique, l’ordre d’insertion des couples clé/élément importe peu. Il est aisé de récupérer la liste des clés, de la parcourir puis de récupérer l’élément correspondant à chaque clé. L’ajout, la suppression ou la modification d’une donnée se fait alors de façon transparente dans l’application.

Le principal intérêt des hashages est qu’il permet de réaliser des automates de traitements de données robustes et fiables ou chaque donnée est identifiée par une clé.

Les tableaux associatifs sont une fonctionnalité intégrée au langage Perl où ils sont appelés "hashages". Ils sont également implémentés en natif dans les langages de programmation modernes comme Java, C#, Vb.net Python ou Ruby.

En Matlab, avant la version 2008b, il n’existait pas d’implémentation native des tableaux associatifs. Il est possible d’utiliser depuis Matlab l’implémentation java.util.Hashtable mais je n’ai pas trouvé comment insérer des structures de données Matlab (objet struct) dans un objet hastable Java. Depuis la version 2008b, il est apparut l’objet containers.Map qui fournit des fonctionnalités équivalentes.

Description


Le principe de fonctionnement d’une classe Hashtable en Matlab est très simple, utilisant des tableaux de cellules pour y stocker les clés et données.

classdef hashtable

 % Properties definition
 properties (SetAccess = private, GetAccess = private)
   cle = {};
   data = {};
 end

 % Class public methods
 methods (Access = public)

 % Constructor
 self = hashtable(varargin);

 % function prototype
 self = clear(self);
 bool = iskey(self, key)
 bool = isvalue(self, value)
 value = get(self, key)
 self = put(self, key, value)
 out = keys(self)
 self = remove(self, key)
 out = size(self)
 val = subsref(self, s)
 self = subsasgn(self, s, val)
end

Installation


Pour utiliser la classe us191.hashtable, il faut une version de Matlab R2008a ou supérieure. Récupérer l’espace de nom ou package us191 avec un client subversion et l’installer dans le répertoire Matlab des toolbox utilisateur ( /MATLAB/toolbox sous Linux ou Mes Documents\MATLAB\toolbox sous Windows).

L’utilisation d’un espace de nom permet d’éviter les conflits de classes synonymes.

$ svn co https://svn.mpl.ird.fr/us191/oceano/trunk/matlab/+us191/

Une version utilisant l’ancien modèle de programmation objet utilisé avec Matlab jusqu’à la version R2007b est disponible dans le fichier suivant :

Hashtable R2007b
Archive compressée de la classe hashtable

Ses fonctionnalités et utilisation sont identiques à la nouvelle version.

Utilisation


Un aperçu de la documentation en ligne :

>> help us191.hashtable
 us191.hashtable class

This class implement a hashtable and is part of us191 package (namespace)
 h = hashtable(key, value, key2, value2, ...)

 hashtable is a part of package us191, use fully qualified
 package name like us191.hashtable or use 'import us191' directive first
 in your function before use this class.

 hashtable is a value class, don't forget to assign return
 function to object:
 h = put(h,...) or h = h.put(...)

% Example:

 h = us191.hashtable
 import us191.*;
 h = hashtable
 h = put(h, 'a', 1)
 h.clear
 h = hashtable('a', 1, 'b', 2)
 h.size
 h.keys
 isempty(h)
 iskey(h,'a')
 s = struct('field1',[1:3],'field2',rand(3))
 h = put(h, 'c', s)
 v = h.c.field1
 v = h('c').field2

 use similar notation
 h = h.put('c', s)
 h.c = s

Comment parcourir les valeurs d’un hashage :

>> h=us191.hashtable('a','toto','b','tata','c','titi')
>> for i = keys(h),get(h,i),end
ans = toto
ans = tata
ans = titi

On obtient également le même résultat en utilisant l’opérateur . (surchargé par la méthode subref) et les champs dynamiques (parenthèses) :

>> for i = keys(h),h.(i),end
ans = toto
ans = tata
ans = titi

Des que l’on voudra utiliser un nombre important de variables, il peut être intéressant de décrire les variables dans un fichier plutôt que de les coder en dur dans le programme. On utilisera à cette effet la classe us191.dynaload qui hérite de la classe us191.hashtable en lui rajoutant des fonctionnalités supplémentaires.

Liens utiles