Accueil - Informatique - Programmation - Langages

Dynaload : créer dynamiquement des structures de données complexes avec Matlab

Publié le samedi 7 février 2009.


Dernière mise à jour : 22/02/2009

Introduction


Lors du codage d’une application manipulant des jeux de données complexes, bien souvent, et pour des raisons de rapidité, le programmeur préfère coder en dur les structures de données que son application devra manipuler.

Le programmeur est alors confronté aux problèmes suivants dès qu’il souhaite faire évoluer son code :

Par exemple, si l’on prend l’utilisation de fichiers NetCDF sous Matlab, la lecture des variables est relativement simple, mais l’écriture d’un fichier avec une dizaine de dimensions et une centaine de variables peut être longue et fastidieuse à réaliser.

De plus, toute modification (correction orthographique, changement de définition, etc) sur des attributs de variables par exemple, nécessitera la modification de nombreuses lignes de codes (avec tous les risques d’erreurs que cela comporte).

Le principe de base de dynaload est de décrire la structure des données non pas dans la code de l’application mais dans un fichier externe, fichier pouvant être un fichier texte ou Excel.

Les champs d’applications de dynaload sont multiples, en voici quelques exemples :

Principe


Dynaload utilise une implémentation en Matlab de tableau associatif ou table de hashage (hashtable en anglais). Un hashage est une structure de données similaire à un tableau car il peut contenir un ensemble de valeurs mais au lieu d’indexer les valeurs par un nombre, le hashage les indexe par une clé unique.

Ces clés sont des chaines auxquelles sont associées un élément, qui peut prendre n’importe quel type, chaine, valeur numérique, structure, tableau, hashage, etc ...

Contrairement aux tableaux, qui nécessitent une manipulation d’indices pour y stocker ou extraire les éléments, il suffit de parcourir la liste des clés d’un tableau associatif, pour accéder à l’élément associé, et ce quelque soit le nombres de clés parcourues.

Un exemple simple tiré de la documentation de la classe us191.dynaload :

Syntaxe


Pour charger une instance de dynaload en mémoire (structure de données), 2 types de fichiers sont autorisés :

tsgqc_netcdf.xls
Fichier de description dynaload sous Excel pour une instance tsg-qc NetCDF
>> nc = us191.dynaload('tsg-qc_netcdf.xls');
>> save(nc, 'tsg-qc_netcdf.csv');
tsgqc_netcdf.csv
Fichier dynaload tsgqc_netcdf.csv issu d’une conversion du fichier Excel

En production, il est préférable d’utiliser le fichier csv pour 2 raisons :

Exemples d’un fichier Excel décrivant la structure d’un fichier NetCDF généré par programme (TSGQC dans ce cas précis).
 :
Feuille dimensions Excel
Feuille Excel décrivant les dimensions d’un fichier NetCDF

Feuille Excel des variables
Feuille Excel décrivant les variables d’un fichier NetCDF

Feuille Excel des codes de qualité
Feuille Excel décrivant les codes de qualité utilisé par le programme TSGQC

Il est également possible de créer une instance de dynaload en mémoire sans passer par un fichier descripteur. On appellera alors le constructeur avec l’argument ’memory’ à la place du nom de fichier et on construira l’objet ’à la main’ dans le programme.

On peut se rendre compte qu’il est possible, dans un seul fichier, de décrire des structures de données complexes et variées, et ce sans écrire une seul ligne de code, ce qui facilite la maintenance et l’évolution de l’application.

A compléter....

Installation


Pour utiliser dynaload, 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/

Utilisation


Cette boite à outils est en cours de développement, de nombreuses fonctionnalités ne sont pas encore implémentées ou sont encore en phase de test. Merci de me signaler tout problème ou remarques permettant d’améliorer son développement.

Liens utiles