Exemples faux de la doc

C’est une des 6 fonctions décrites dans le chapitre File Name Construction :

  • filemarker : Character to separate file name and internal function name
  • fileparts : Parts of file name and path
  • filesep : File separator for current platform
  • fullfile : Build full file name from parts
  • tempdir : Name of system’s temporary folder
  • tempname : Unique name for temporary file

Je les connaissais toutes sauf celle là.

  • Ce que dit la doc

Voici une copie d’écran de ce qu’indique la doc R2010b de filemarker :

filemarker

L’exemple cherche à lire l’aide de pdeodes qui est une sous fonction de pdepe.m.
Alors vite faite pdepe ce que ça fait , ça résout des problèmes avec une condition initiale pour les équations aux dérivées partielles (EDP) en 1D , en anglais :
Solve initial-boundary value problems for parabolic-elliptic PDEs in 1-D.

pdepe est une deux fonctions standard de MATLAB (sinon il faut la PDE Toolbox) pour traiter les équations différentielles partielles , l’autre étant pdeval qui évalue la solution numérique de l’équation partielle différentielle en utilisant la sortie de la fonction pdepe.
Pour tout savoir sur les équations différentielles, je vous renvois vers la bible:
1510 – Differential Equations in MATLAB .

  • Testons l’exemple

Le truc c’est que si vous évaluez l’exemple dans la R2010b:

>>helptext = help(['pdepe' filemarker 'pdeodes'])

cela ne retourne pas du tout l’aide de la sous fonction pdeodes mais plutôt une chaine vide.

La preuve en image , j’ai édité la fonction pdepe , et comme on le voit dans le Command Window j’ai testé l’exemple en 10b.

example helptext

  • Investiguons

J’ai aussi testé cet exemple dans plusieurs releases MATLAB : en R2008b, R2009a, R2009b et R2010a. Dans les 6 releases j’ai toujours une chaine vide. Alors j’ai regardé quand est ce que le fichier pdepe a été modifié:

date pdepe

Et là ça me rassure , on voir que la donction pdepe a été modifiée courant octobre 2007. Ce qui explique que pour toutes les releases à partir de la R2008 on a le même résultat.
Pour le vérifier , j’ai alors démarré la R2006b et réédité la fonction pdepe.

date pdepe 6b

On constate que la dernière modification est de 2005.

Et là en revanche l’exemple fonctionne avec MATLAB 7.3 (R2006b):

example helptext 6b

Il me restait donc plus qu’une chose a faire , comparer les 2 fichiers entre la R2006b et la R2010b pour comprendre la modif d’octobre 2007.

  • Comparison Tool

Pour comparer les 2 fichiers , je vais utiliser l’outil de comparaison de MATLAB avec la fonction visdiff. Voilà les commandes que j’ai tapées en R2010b:

>> fname10b= which(‘pdepe’)

fname10b =

C:\MATLAB\SOF\r2010b\toolbox\matlab\funfun\pdepe.m

>> fname6b =’C:\MATLAB\SOF\r2006b\toolbox\matlab\funfun\pdepe.m';

>> visdiff(fname6b,fname10b)

A gauche pdepe en 6b , à droite en 10b . Et là on voit que le changement est que maintenant pdeodes est une fonction imbriquée : une nested fonction.

visdiff

Voilà pourquoi filemarker ne marche plus sur cet exemple.
En effet la doc de filemarker stipule :

M = filemarker returns the character that separates a file and a within-file function name.

En 2006b , c’était le cas, pdeodes était une fonction distincte de pdepe alors que maintenant elle est imbriquée.
Évidemment comme à mon habitude j’ai remonté ce bug aux équipes support de TMW.

Faire parler son ordi avec MATLAB

Et pour triper un peu plus changer le Rate qui peut aller de -10 à 10 (zéro par défaut), à -10 ça parlera tout doucement alors qu’à 10 , ça speed sévère!

speaker.Rate = -10;
speaker.Speak(‘I am a matlab geek and proud of it’)

Ca aussi ça m’a bien fait triper , on diarait que le pc il a fumé :)
Le son (speaker.Volume) quand à lui peut varier entre 0 et 100.

Faire parler son ordi avec MATLAB (part 2)

  • Test du code dans toutes les releases MATLAB

Le code suivant :

NET.addAssembly(‘System.Speech’);
speaker = System.Speech.Synthesis.SpeechSynthesizer();
speaker.Rate = 1;
speaker.Volume = 100;
speaker.Speak(‘I am a matlab geek and proud of it’)

ne fonctionne qu’à partir de la R2009a. Mais cette limitation est documentée comme vous pourrez le lire plus bas ….

En R2008b la première ligne de code:

>>NET.addAssembly('System.Speech');

retourne l’erreur suivante :

??? Undefined variable « NET » or class « NET.addAssembly ».

Ce message veut dire que la fonction NET.addAssembly n’est pas connue. Alors que dans les versions R2009b, R2010a ou R2010b , la fonction which retourne:

>>which NET.addAssembly
addAssembly is a built-in method % static method or package function

  • Compilation du code

J’ai compilé le code avec le MATLAB Compiler sous Windows en R2010b . L’exécutable fonctionne.

  • Vidéo sur .NET

Et finalement en investiguant , je me suis rendu compte que ce n’était pas une si grande découverte de faire parler son ordi avec MATLAB… tout est en fait dans la doc de MATLAB !!
Et il y a même une vidéo qui montre ce code … la loose !

En effet si on regarde les releases notes de la R2009a , on tombe sur cette page qui décrit la nouvelle fonctionnalité de MATLAB pour s’interfacer avec le .NET :

releases .NET

Comme on le voit dans ma copie d’écran , on nous propose de cliquer sur un lien pour accéder à une vidéo de 8m39s :

video .NET

Donc en fait ça fait 4 releases que cette vidéo qui montre comment faire parler son pc existe !!! comme quoi la doc est vraiment immense !!

Blague mexicaine dans MATLAB ?

  • Contexte

Le 1er décembre 2010 dans lequel je présentais un de mes MATLAB Goodies (cadeau publicitaire) : le porte-gamelle MATLAB.

gamelle MATLAB

Un des lecteurs de ce blog matlab4geek a répondu qu’il aimerait bien remplacé son sac Mac Do par le mien … ce que je comprends très bien ! En tant que MATLAB geek, ça m’a fait penser à une vieille blague MATLAB que j’avais vue sur le newsgroup.

  • Blague MATLAB pour Geeks

Vous avez surement entendu parlé ou déjà mangé dans la chaîne de restaurants Tex Mex.
texmex restaurant

Eh beh sachez qu’il y a un fichier mexicain texmex livré avec MATLAB !

Vous ne me croyez pas ? Pourtant un honorable professeur de l’Université de Floride en février 2007 a écrit ce billet sur le MATLAB Central intitulé : A truly awful MATLAB joke …

texmex matlab

Alors comme indiqué par l’auteur , c’est vraiment une blague réservée aux MATLAB Geeks , à se tortilla de rire ;)!

  • Vérification dans MATLAB

Bon ce fichier est une DLL , un mex-file exactement et donc on n’a pas accès au code source.
Dans MATLAB il suffit de taper la commande suivante pour le vérifier:

>>which -all texmex
C:\MATLAB\SOF\r2010b\toolbox\matlab\graphics\private\texmex.mexw32 % Private to graphics

L’extension varie suivant la plateforme où vous travaillez. C’est la commande mexext dans MATLAB qui vous retournera cette info.
Sous Windows 32-bit:

>> mexext

mexw32

Voici pour infos un tableau récapitulant les extensions de ces fichiers binaires:

mexext

Revenons à nos moutons, le MEX-file texmex est appelé par la fonction tex qui n’est disponible que depuis la R14.

tex

En effet l’exemple proposé en commentaires dans la fonction tex.m ne marchera pas en Release 13.
Il était en effet impossible d’écrire des équations Tex dans une figure MATLAB. Le code retournerait:

??? Error using == > text
Bad value for text property: ‘Interpreter’.

En R14 si on évalue ce même code:

>>mytexstr = '$\frac{1}{2}$';
>>

h = text('string',mytexstr,...
           'interpreter','latex',...
           'fontsize',40,...
           'units','norm',...
           'pos',[.5 .5]);

on obtient la figure suivante:

equation tex matlab

Voilà c’était la pensée matlabienne du jour …

Changer de répertoire rapidement (part 2)

  • Autre méthode : utilisation du package editoservices

Si vous avez au moins 1 fichier ouvert dans le MATLAB Editor , vous pouvez taper la commande suivante pour aller dans le répertoire contenant le fichier.

>>cd(fileparts(editorservices.getActiveFilename))

Cela pallie à la limitation de la fonctionnalité de la 4ème méthode que j’avais présentée : Change Current folder to ( dispo depuis la 10b) . En effet pas besoin d’avoir 2 fichiers ouverts dans l’Editor , un seul suffit.
Cette commande marche à la fois sous Windows et linux.

  • editoservices en bref

La commande suivante en R2010b :

>> help editorservices

retourne dans le Command Window les différentes méthodes pour faire mumuse avec l’Editor :

EDITORSERVICES Summary of Editor services functionality
Programmatically access the MATLAB Editor to open, change, save, or close
documents.

MATLAB Version 7.11 (R2010b) 03-Aug-2010

Work with all documents currently open in the Editor:
closeGroup – Close Editor and all open documents.
getAll – Identify all open Editor documents.

Work with single document currently open in the Editor:
getActive – Find active Editor document.
getActiveFilename – Find file name of active document.
find – Create EditorDocument object for an open document.
isOpen – Determine whether specified file is open in Editor.

Open an existing document or create a new one:
new – Create document in Editor.
open – Open file in Editor.
openAndGoToFunction – Open MATLAB file and highlight specified function.
openAndGoToLine – Open file and highlight specified line.

  • Limitation

La commande cd(fileparts(editorservices.getActiveFilename)) ne fonctionne qu’à partir de la R2010a.
Dans les précédentes releases, vous aurez les messages d’erreur suivant:

en R12Sp1
??? Undefined variable ‘editorservices’.

en R13Sp1
?? Undefined variable ‘editorservices’ or class ‘editorservices.getActiveFilename’.

en R2009a ou R2009b:
??? Undefined function or variable ‘editorservices’.

Mais mais en cherchant bien on peut trouver des solutions de contournement:
Is it possible to open and close multiple files in the Editor programmatically in MATLAB 7.9 (R2009b)?
D’ailleurs la solution proposée utilise également le package editorservices.

Le premier post de TMW à en parler date d’octobre 2009 et est de Michael Katz : The MATLAB Editor at your fingertips

  • Dernier test

Et que se passe t-il si en R2010a ou en R2010b si on tape la commande alors qu’aucun fichier n’est ouvert dans l’Editor MATLAB… suspense …

??? Error using == > cd
Cannot CD to (Name is nonexistent or not a directory).

normal !!

  • Conclusion

Bon moi du coup c’est ma méthode préférée et je m’en suis fais un shortcut MATLAB , c’est super pratique!!

Draguer avec MATLAB

Bon évidemment vous ne trouverez aucune note technique sur le site officiel de The MathWorks pour draguer ;)

  • Le message codé

Imaginez que vous envoyez à une de vos collègues ce message:

106 101 32 116 101 32 107 105 102 102 101 32 103 114 97 118 101

  • Décryptage

Évidemment elle ne va pas comprendre … mais si elle a l’idée de convertir ce vecteur en chaine de caractères elle va vite rougir!!:

>> char([ 106  101   32  116  101   32  107  105  102  102  101   32  103  114   97  118  101])

ans =

je te kiffe grave

  • Reverse engineering

Bon maintenant comment j’ai fait pour créer ce vecteur , beh tout simplement j’ai utilisé int8!

drague4geek =int8(‘je te kiffe grave’)

drague4geek =

106 101 32 116 101 32 107 105 102 102 101 32 103 114 97 118 101

J’aurais pu aussi utiliser double à la place de int8 mais pourquoi perdre de la place en mémoire. En effet int8 occupe 1 octet par élément contre 8 pour double.

  • Facebook

Sur Facebook quand c’est votre anniversaire , tous vos amis vous souhaitent sur votre mur : « Joyeux anniversaire! »
Alors maintenant si votre pote a MATLAB , soyez original et marquez sur son mur:

74 111 121 101 117 120 32 97 110 110 105 118 101 114 115 97 105 114 101 33

Voilà bonne chance !!!

Faire un sapin de noel avec MATLAB

  • Vive le File Exchange !

Alors ne réinventez pas la roue, il y a un fichier qui le fait déjà sur le File Exchange :
A christmas tree plot

Il a été écrit en 2008 et a été sélectionné comme POTW le 25 décembre de la même année.
Regardez comme c’est joli :

christmas tree matlab

Pour créer le sapin on utilisera les 2 fonctions suivantes :

  • cylinder : Generate cylinder
  • surfl : Surface plot with colormap-based lighting

Pour créer les cadeaux en bas du sapin, on utilisera la fonction surf:

  • surf : 3-D shaded surface plot

Pour créer les flocons de neige , la fonction plot3 fera l’affaire:

  • plot3 : 3-D line plot
  • Et comment qu’on dit joyeux noël avec MATLAB?

Alors là j’aurais envie de vous souhaiter Joyeux noël MATLAB geeks! ou si vous vous rappelez de mon billet Draguer avec MATLAB on pourrait écrire dans MATLAB:

>> xx = int8(‘Joyeux noël MATLAB geeks!’)

xx =

Columns 1 through 18

74 111 121 101 117 120 32 110 111 127 108 32 77 65 84 76 65 66

Columns 19 through 25

32 103 101 101 107 115 33

>>char(xx)

ans =

Joyeux nol MATLAB geeks!

Mince il y a un caractère spécial du à l’accent dans le mot noël. En effet int8 affiche les valeurs entre -128 à 127. Or pour afficher le ë , on a besoin d’un char(235). Le int8 va donc faire un carré blanc, du coup il faut utiliser double ou int16:

>> yy = double(‘Joyeux noël MATLAB geeks!’)

yy =

Columns 1 through 15

74 111 121 101 117 120 32 110 111 235 108 32 77 65 84

Columns 16 through 25

76 65 66 32 103 101 101 107 115 33

>> char(yy)

ans =

Joyeux noël MATLAB geeks!

Voilà c’est mieux !

  • Plus de fun

Sur le blog File Exchange Pick of the Week où christmas a été sélectionné : Holiday Cheer!
le premier commentaire donne une procédure pour faire tourner le sapin sur lui même en utilisant l’icône Orbit Camera depuis le menu View -> Camera Toolbar . Franchement c’est sympa et ça permet de se rappeler de ces « gadgets » !

Sur la page du Fex où le fichier peut être téléchargé , un commentaire suggère pour la version 2 de christmas.m d’animer les flocons de neige. Pour cela rien de plus simple, moi je remplacerais la ligne suivante:

plot3(snowX,snowY,snowZ,'w*')%plot coordinates as white snow flakes

par une for-loop:

for  ii = 1 : numel(snowX)
plot3(snowX(ii),snowY(ii),snowZ(ii),'w*')%plot coordinates as white snow flakes
pause(0.1)
end

et pour accélérer l’animation, il suffirait de réduire le nombre de flocons de 800 par défaut à 100 par exemple.

snow=100; % number of snow flakes [0 .. 5000]

Have fun !

Commenter en bloc

Donc l’autre jour je suis tombé sur cette fonctionnalité appelée le block comment.

C’est documenté dans la partie : Commenting in MATLAB Code Using Any Text Editor

Voici l’exemple fourni dans la doc :

block comment

  • Comment ça marche :

Il faut à minima avoir sur son clavier les Curly braces {} et le percent % ;)

1ère étape vous utilisez un pourcentage suivi d’une accolade : %{
2ème étape vous écrivez vos lignes de commentaires
3ème étape vous fermez le bloc de commentaires avec un %}

Important : Comme spécifié dans la doc , il ne faut pas de texte sur les lignes où se trouve les %{ et %} , sinon ça ne marche pas.

  • Avantages de cette fonctionnalité:

Moi ça m’arrive pleins de fois que je télécharge des fichiers du File Exchange et que pour les tester , j’utilise les exemples (quand il y en a) fournis par le code.
Ces exemples sont généralement dans le header du M-file et sur plusieurs lignes, il faut donc « décommenter » ces lignes pour les évaluer.

1. Donc c’est là le gros avantage du block comment c’est de pouvoir évaluer PLUSIEURS lignes de code qui sont commentées.

2. Avec le block comment , on gagne du temps, pas besoin de faire un Ctrl+T.

3. De plus on ne risque pas d’oublier de recommenter ces lignes , sans ça le code va planter.

  • Exemple

Pour vous montrer les avantages ci-dessus , je vais prendre une fonction MATLAB qui n’est pas une built-in et qui a un exemple dans son header. Alors le big deal c’est d’utiliser la fonction deal de MATLAB … blague de MATLAB Geek ;)

>>edit deal

On trouve 2 exemples dans deal.m :

deal example

Prenons le second qui permet entre autres de comprendre la puissance de deal et que j’utilise dans la plupart de mes logiciels.

Donc là si je veux évaluer les lignes 26 et 27 dans MATLAB je suis obligé de décommenter les lignes.
Pour cela je sélectionne à la souris ces lignes et je fais Ctrl+T puis F9 , ce qui est équivalent sans utiliser ces shortcuts MATLAB à faire: clic droit -> « Uncomment » puis « Evaluate Selection »
Si ce même code était dans un block comment, j’aurais juste eu à faire F9 sur ces lignes.

Deuxièmement imaginons que j’oublie de recommenter ces lignes 26 et 27 :

deal uncomment

et que plus tard je réutilise deal. Bon beh c’est là que MATLAB va tourner en boucle :

>>   [filenames{1:length(direc),1}] = deal(direc.name)

??? Maximum recursion limit of 500 reached. Use set(0,’RecursionLimit’,N)
to change the limit. Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in == > deal

C’est ce que je disais dans le point 3 précédent : MATLAB plante et c’est normal. Vu qu’on a laissé les exemples décommentés , la fonction deal va s’appeler elle-même récursivement. Bon MATLAB il est pas con , au bout de 500 fois il arrête le délire!

  • Limitation:

Trouvant cette fonctionnalité pas mal, je me suis dit que ce serait bien de l’avoir dans le contextmenu .
Par exemple prenons mon utilitaire emailtool_nodisplay (posté sur le FEx). Ce code contient 160 lignes de commentaires avant la première ligne de code. Si je fais un clic droit, le menu qui s’ouvre est le suivant :

emailtool comment

Il n’y a aucune référence à l’option block comment. Alors qu’est ce que j’ai fait à votre avis? Et beh comme d’hab j’ai contacté le support technique de The MathWorks le 16 novembre 2010 pour leur proposer cet enhancement.
Voici leur réponse:

enhancement comment

Donc à voir ;)

Feu d’artifice dans MATLAB

le fichier zip : FireworksGUI.zip
Lancer le code :

>>FireworksGUI

puis cliquer sur l’icône en haut à gauche pour lancer la démo et vous aurez le droit à un joli feu d’artifice dans MATLAB et avec du son qui plus est !!

fireworks matlab r2010b

Il a été écrit par un mathworksien évangéliste en utilisant la programmation orientée objet.

Ce que j’aime bien dans la doc sur l’OOP (Object-Oriented Programming) , c’est qu’il y a tout d’abord une vidéo suivie de 2 sections : une qui explique pourquoi et quand utiliser ce type de programmation et une autre réservée aux utilisateurs avancés :

oop matlab

Honnêtement je n’ai pas encore chopé ce style de programmation qui existe depuis la R2008a, ce sera une de mes résolutions pour 2011 !

Sur ce bon réveillon MATLAB geeks!!