Archives mensuelles : janvier 2014

Ordre des appels à ispc, isunix et ismac avec MATLAB

J’ai récemment déployé une application sur Mac OS X avec le MATLAB Compiler. Elle n’était utilisée jusqu’à présent que sur Windows et Linux.

Cette application contient un outil qui me permet de récupérer certaines caractéristiques de la machine. Je récupère, entres autres, le nom de l’architecture où s’exécute le code, à savoir Windows, Linux ou Mac.

Code initial de récupération de l’architecture

Voici approximativement comment est codé le log :

fid = fopen('bug.log', 'wt');
if ispc
   fprintf(fid, 'OS: Windows\n');
elseif isunix
   fprintf(fid, 'OS: Linux\n');
else
   fprintf(fid, 'OS: Mac\n');
end
fclose(fid);

Or cette façon de procéder est fausse car, avec Mac OS X, le fichier bug.log contient la ligne suivante :

OS: Linux

Bizarre, non ?

D’où vient l’erreur ?

Les fonctions ispc, isunix et ismac utilisent en fait la fonction computer qui renvoi l’architecture de la machine sous forme d’une chaine de caractères qui peut être :

  • ‘PCWIN’ ou ‘PCWIN64′ pour Windows
  • ‘GLNX86′ ou ‘GLNXA64′ pour Linux
  • ‘MACI64′ pour Mac

Les trois architectures devraient donc être bien différenciées.

Pourquoi mon implémentation du log ne fonctionne-t-elle pas correctement ?

Étudions les fonctions ispc, isunix et ismac. Vous pouvez visualiser leur code en ouvrant les fichiers ispc.m, ismac.m et isunix.m dans le MATLAB Editor ou dans n’importe quel éditeur de texte.

ispc

Le fonction ispc compare simplement les deux premiers caractères de la chaine renvoyée par la fonction computer. Si ces deux caractères sont ‘PC’ alors la machine tourne sur Windows.

ismac

Sur le même principe, la fonction ismac teste si les trois premiers caractères de la chaine renvoyée par computer sont ‘MAC’. Tout est normal.

isunix

Surprise, la fonction isunix fait simplement l’inverse de la fonction ispc.

Le code de isunix est équivalent à :

isunix = ~ispc;

Donc pour MATLAB, tout ce qui n’est pas Windows est forcément Linux !

C’est utile à savoir, je corrige donc mon code.

Code corrigé de récupération de l’architecture

La condition ismac doit donc obligatoirement apparaître avant isunix :

fid = fopen('bug.log', 'wt');
if ispc
   fprintf(fid, 'OS: Windows\n');
elseif ismac
   fprintf(fid, 'OS: Mac\n');
else
   fprintf(fid, 'OS: Linux\n');
end
fclose(fid);

Me voila prévenu, et vous aussi !

:)

Dans un prochain billet, je vous expliquerai l’intérêt pour MATLAB d’assimiler Mac à Linux avec isunix (les utilisateurs avertis connaissent déjà sans aucun doute la réponse). ;)

Pour ouvrir « MATLAB », il vous faut un moteur d’exécution Java SE 6

Je ne me suis pas servi de MATLAB sur mon Mac depuis une (récente) mise à jour vers OS X 10.9 (Mavericks).

Et ce matin, surprise : impossible d’ouvrir MATLAB. :sad:

Erreur relative à Java SE 6

Voici le message d’erreur qui apparait :

Pour ouvrir MATLAB, il vous faut un moteur d'execution Java SE 6

Le problème vient semble-t-il du fait que Java n’est plus fournit avec les dernières versions de OS X.

C’est ce que j’ai constaté en ouvrant une console :

Mac-mini-de-Jerome:~ jerome$ java -version
No Java runtime present, requesting install.

J’ai tenté l’installation proposée en cliquant sur « Installer Â», mais sans succès.

La solution a donc consisté à télécharger Java SE 6 sur cette page : Java for OS X 2013-005

Après installation :

Mac-mini-de-Jerome:~ jerome$ java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)

Erreur relative à X11

A la première exécution de MATLAB, j’ai eu droit à un nouveau message d’erreur, cette fois pour X11.

Pour ouvrir MATLAB_maci64, vous devez installer X11.

En cliquant sur « Continuer Â», on accède à cette page : About X11 and OS X

On peut y lire :

X11 is no longer included with OS X, but X11 server and client libraries for OS X are available from the XQuartz project

Je suis donc allé dans le Launchpad et j’ai ouvert XQuartz.
Ce dernier m’a proposé une mise à jour et j’ai enfin pu ouvrir MATLAB.

:mrgreen:

5 conseils pour améliorer la lisibilité de vos codes MATLAB

Voici cinq conseils pour rendre vos codes MATLAB plus lisibles, surtout quand vous débutez avec MATLAB.

Ceci aura pour effet d’en simplifier la lecture et la compréhension pour d’autres développeurs, mais aussi pour vous-même si vous êtes amenés à travailler de nouveau sur un de vos codes au bout de plusieurs mois.

Bien entendu, la lisibilité est un critère parmi d’autres et n’est pas une fin en soit. Malgré tout, vous aurez tout intérêt à suivre ces conseils si vous êtes débutant avec MATLAB ou si vous développez de manière occasionnelle.

N’hésitez pas à apporter des compléments à ces conseils ou à discuter certains points en particulier.

1 – Utilisez l’indentation du code

L’indentation du code aligne verticalement le début de chaque ligne de code selon des règles propres à chaque langage.

En plus d’améliorer la lisibilité du code, l’indentation du code permet souvent de distinguer des erreurs à l’Å“il nu. Par contre, elle ne sert généralement à rien pour le compilateur ou l’interpréteur (sauf pour certains langages comme Python)

Pour effectuer une indentation correcte du code MATLAB, il faut sélectionner l’ensemble du code dans l’éditeur, puis utiliser le menu « Text > Smart Indent Â». On peut aussi utiliser les raccourcis clavier suivants :

  • Windows : Ctrl+A (sélection) puis Ctrl+I (indentation)
  • Mac : ⌘+A (sélection) puis ⌘+I (indentation)
  • Linux (Emacs) : Ctrl+X,H (sélection) puis Ctrl+Alt+/ (indentation)

Exemple de code sans indentation :

M = rand(2,3);
for i = 1:2
for j = 1:3
if M(i,j)<=0.5
M(i,j) = 0;
else
M(i,j) = 1;
end
end
end
M

Le même code avec indentation :

M = rand(2,3);
for i = 1:2
    for j = 1:3
        if M(i,j)<=0.5
            M(i,j) = 0;
        else
            M(i,j) = 1;
        end
    end
end

2 – Mettez des espaces dans les lignes de code

a) Avec l’opérateur « = Â»

Ajouter un espace avant et après l’opérateur d’affection « = Â» améliore la lisibilité du code.

Par exemple :

M=rand(2,3);

La commande ci-dessus s’écrit plus lisiblement comme ceci :

M = rand(2,3);

Les termes de droite et de gauche sont directement identifiables.

Des espaces peuvent également être ajoutés autour du signe « = Â» de la première ligne des boucles for-end :

for i = 1:2

Certains préconisent également d’ajouter des espaces avec les autres opérateurs mathématiques.

Par exemple :

x = a/b+c;

L’équation ci-dessus pourrait aussi s’écrire :

x = a / b + c;

b) Avec les arguments d’une fonction

On peut également utiliser des caractères d’espacement après les virgules au niveau des arguments d’une fonction.

Par exemple :

[i,j,v] = find(M>0.5,1,'first');

L’appel à la fonction find devient :

[i, j, v] = find(M>0.5, 1, 'first');

L’identification de chaque argument est ainsi améliorée.

3 – Évitez d’utiliser des virgules pour séparer les éléments d’un tableau

En mathématiques, nous utilisons la virgule comme séparateur de décimales (les anglo-saxons utilisent le point).

Dans MATLAB, la virgule peut servir à séparer des valeurs numériques sur une même ligne d’un tableau.

Par exemple :

M = [1, 2, 3 ; 4, 5, 6 ; 7, 8, 9];

Les virgules sont ici inutiles pour MATLAB et peuvent, à tort, faire penser à une suite de nombres réels.

Leur suppression enlève donc cette possible confusion sans nuire à la lisibilité du code.

L’exemple devient :

M = [1 2 3 ; 4 5 6 ; 7 8 9];

4 – Ne supprimez pas le « 0 Â» pour les nombres réels dans l’intervalle ]-1,1[

La syntaxe MATLAB permet de ne pas utiliser le caractère « 0 Â» dans l’écriture des nombres réels contenus dans l’intervalle ]-1,1[.

Par exemple :

if M(i,j)<=0.5

Dans la condition précédente, la valeur 0.5 pourrait s'écrire .5 et la condition deviendrait :

if M(i,j)<=.5

On voit ici que le rapprochement des termes « <=. Â» diminue la lisibilité du code.

Ceci est encore plus vrai avec les valeurs négatives :

if M(i,j)<=-.5

5 РSupprimez les parenth̬ses superflues

a) Opérations mathématiques

Les parenthèses ne doivent être utilisées que pour assurer l’ordre de priorité des opérations.

Par exemple, dans le calcul suivant :

result = ((X(1)*35.1)+(X(5)*20.25)+(X(8)*2.5)-(X(9)*105.78));

Les parenthèses ne servent à rien et peuvent être avantageusement remplacées par des espaces :

result = X(1)*35.1 + X(5)*20.25 + X(8)*2.5 - X(9)*105.78;

b) Opérations logiques

Comme précédemment, selon l’ordre de priorité des opérateurs, certaines parenthèses peuvent être supprimées dans les conditions logiques.

Par exemple :

if (x(1)>0.5)&&((x(2)<1)||(x(3)>0.1))

La condition précédente peut se simplifier comme ceci :

if x(1)>0.5 && (x(2)<1 || x(3)>0.1)