MathWorks publie deux versions de MATLAB par an avec à chaque fois son lot de nouvelles fonctions. La version R2014b est attendue prochainement.
Si vous souhaitez diffuser vos programmes à un maximum d’utilisateurs, vous devez veillez à la compatibilité descendante (ou rétrocompatibilité) de vos codes. C’est à dire que vous devez prendre en compte le fait que certains utilisateurs ont une version moins récente de MATLAB que la vôtre.
Deux questions se posent alors :
- jusqu’à quelle version de MATLAB assurer la compatibilité ?
- comment déterminer ce qui casse la compatibilité descendante ?
Quelle version de MATLAB ?
Vous vous en douterez, il n’y a pas de réponse précise à cette question… Nous avons ouvert plusieurs sondages sur le forum MATLAB :
- Quelle version de MATLAB utilisez-vous en 2013 ?
- Quelle version de MATLAB/Simulink utilisez-vous au premier semestre 2014 ?
Au passage, vous pouvez toujours participer au sondage de 2014 !
En voici les résultats :
Malgré le peu de votes, on peut juger que la compatibilité devrait être gérée jusqu’aux versions R2011.
Comment déterminer ce qui casse la compatibilité descendante ?
La solution la plus efficace est d’installer la version la plus ancienne de MATLAB pour laquelle vous souhaitez assurer la compatibilité sur votre machine de développement. Votre licence MATLAB vous permet d’installer les versions plus anciennes.
A l’exécution du code, en cas de problème de compatibilité, vous rencontrez surement l’erreur Undefined function or variable ‘***’. Dans ce cas, vous devrez alors écrire un code alternatif pour gérer l’absence de cette fonctionnalité. Vous pourrez alors utiliser la fonction verLessThan présentée ci-dessous.
Si vous ne pouvez pas installer une ancienne version, il faudrait alors faire la liste de tous les changements répertoriés dans les Release Note des versions de MATLAB (voir la FAQ Où trouver la documentation des différentes versions de MATLAB en ligne ?). Tout ça risque d’être assez laborieux. Vous pouvez consulter une liste partielle de ces changements sur ce site : MatlabVersionsCompatibility.
La fonction verLessThan
La fonction verLessThan permet de tester si la version de MATLAB en cours d’utilisation est antérieure à une version donnée. Pour les numéros de version, voir la deuxième colonne du tableau donné dans la FAQ : Quelles sont les différentes versions de MATLAB ?
Prenons le cas de la fonction strjoin ajoutée avec la version R2013a (8.1) de MATLAB. Une version antérieure de MATLAB ne pourra pas l’exécuter. Vous devrez donc pas exemple écrire votre propre fonction mystrjoin et faire le teste suivant dans le code :
B = mystrjoin(A, ',');
else
B = strjoin(A, ',');
end
Conclusion
Comme vous l’aurez compris, il est difficile d’assurer une compatibilité parfaite d’un code MATLAB récent avec des versions plus anciennes. J’espère au moins vous avoir sensibilisé à ce problème.
Deux conseils pour finir :
- spécifiez la version de MATLAB que vous avez utilisée dans l’entête de votre code
- laissez également un email pour permettre aux utilisateurs de vous contacter
Tres bon article. Concrètement passer de la 11b à une version supérieure n’est pas aisée avec le changement des fonctions ismember , intersect , setdiff …à part si on utilise le flag legacy (mais qui n’est pas reconnu évidemment en 11b) . Le legacy flag permet d’obtenir le même comportement à partir de la 12a que celui qu’il y avit dans les versions antérieures (un peu comme dans l’idée du fameux flag -v6) .Du coup si on veut que les codes soient fonctionnels à la fois en 11 b et en 14a par exemple on n’a pas d’autre choix que d’utiliser verlessthan . Le problème est que cette fonction est très longue au passage pour capturer la version MATLAB utilisée ( et donc à éviter dans des boucles)
Une autre idée sinon c’est de migrer complétement et de dire que le soft n’est opérationnel qu’à partir de la version 12a. ET que l’utilisateur final ne pourra donc pas utiliser ce code en 11b.
Mais bref la compatibilité ascendante et descendante est de moins en moins évidente avec MATLAB depuis quelques années.