Importdata en R2012a a changé!

Alors imaginez le fichier texte suivant bug12a.txt, composé de deux lignes de commentaires (2 text header lines ) suivies par une matrice 2*3 . Les chiffres sont séparés par des espaces :

% A=importdata(‘bug12a.txt’) returns A as a matrix in all MATLAB releases …
% except in R2012a where A is a structure
1 2 3
4 5 6

En R2011b,
A=importdata(‘bug12a.txt’)

retournait juste la matrice :

A =

1 2 3
4 5 6

Importdata a toujours marché ainsi. J’ai en effet vérifié sur ma machine que c’était aussi le cas en R13SP1, R2006b , R2008b, R2009a, R2009b, R2010b , R2011a … et là suspense…
ce n’est plus le cas avec la nouvelle Release … une déception de plus :(
Maintenant en R2012a la même commande me retourne :

A =

data: [2×3 double]
textdata: {2×1 cell}
rowheaders: {2×1 cell}

du coup il faut changer son code :(

Ce qui m’ennuie le plus c’est que ce changement est mentionné nulle part dans la doc de la PreRelease R2012a.

Allez histoire de bien enfoncer le clou , même avec MATLAB 6.1 (R12) , ça marchait:

importdata

Autant dire que pour l’instant moi et la r2012a on est fâchés ;)

License agreement

En effet j’ai relu le license agreement (license.txt livré avec MATLAB ), qui est aussi accessible depuis le menu Help -> Terms of Use.

licensing r2012a

On peut lire entre autres:

1. The Prototype is provided to you on a confidential basis and is to
be used and handled by you only to the limited extent necessary for your
internal review, testing, and evaluation in conjunction with MathWorks.
You agree, in good faith, to thoroughly test and evaluate the Prototype, to
promptly furnish the results of all such testing and evaluation to
MathWorks, to provide sufficient personnel and programming support to
complete the testing and evaluation, and to respond to inquiries from
MathWorks regarding your use of the Prototype in accordance with the
limitations herein.

Donc vous comprendrez que je ne peux pas continuer à donner mon point de vue avant la sortie officielle de la R2012a.

Technical Support Requests Use Proxy Settings

r2012a

D’autant plus que dans les nouveautés de la R2012a , au chapitre Desktop Tools and Development Environment, MATLAB Version 7.14 (R2012a) on peut lire :

Technical Support Requests Use Proxy Settings

You can submit Technical Support requests from MATLAB by selecting Help > Submit a MathWorks Support Request. In previous releases, if you were connected to the Internet via a proxy server, you had to save the request form to a text file and then email it to MathWorks. Starting with R2012a, you can submit the request directly from the form.

Ça ça m’intéresse vraiment comme amélioration.

Première chose que j’ai remarquée , avant que le formulaire apparaisse il faut attendre au moins 6 secondes. Le pointeur de la souris est en mode watch pendant ce temps.

Ensuite malheureusement (pas de chance une fois de plus!) il est impossible avec la Prerelease de tester cette fonctionnalité.

formbugr2012a

Lorsqu’on appuie sur le bouton Submit , apparait l’icone d’erreur :
Valid Integer License is required

En effet il faut que le numéro de licence MATLAB soit un entier alors qu’avec cette beta ça retourne (ce qui est normal) :

>> license

ans =

Prerelease

Donc ça je ne pourrais le tester qu’en Mars 2012 :(

Mes 2 précédents articles à ce sujet :
10 Jan 2011

http://blog.developpez.com/matlab4geek/p9652/r2011a/soumettre-un-bug/soumettre-un-bug/

13 avril 2011:

http://blog.developpez.com/matlab4geek/c2769/r2011a/soumettre-un-bug/

Sur le blog Mike on the MATLAB Desktop :
Requesting Technical Support From Within MATLAB

Mon premier arrayfun

Pour la petite histoire , cette fonction est apparue avec MATLAB 7.1 (R14SP3) c’est à dire en septembre 2005 . Donc 6 ans plus tard je me réveille quand même !
Je souhaitais créer une cellule 1*4 allant de 2005 à 2008 sans utiliser une boucle for et sans l’écrire ainsi :
C = {‘2005′,’2006′,’2007′,’2008′}

parce que là quand on a 4 valeurs c’est encore simple à le taper mais si on en a 100 , forcément on va penser à utiliser une for-loop.
Et c’est là qu’arrayfun combiné avec un int2str et l’option UniformOutput à false m’a sauvé la life ;)

>> C = arrayfun(@int2str,2005:2008, ‘UniformOutput’, 0)

C =

‘2005’ ‘2006’ ‘2007’ ‘2008’

Bref c’était la pensée du jour ! Il ne me reste encore à trouver un scénario où je pourrais utiliser la fameuse fonction accumarray pour finir l’année en beauté.

Donner votre avis

Page Not Found

En effet le lien est cassé (broken link).
D’habitude j’utilise le lien fourni Inform the webmaster en bas qui vous remplit automatiquement le destinataire et le sujet dans voitre boite mail Outlook:

webmaster

Mais pour changer , j’ai utiliser le lien Contacts qu’on trouve en haut à droite du site MathWorks:

liencontacts

Ouis j’adooore me balader sur ce site !

Bref j’arrive donc à la page suivante:

http://www.mathworks.fr/company/aboutus/contact_us/

contacts

J’ai donc ensuite cliqué sur le lien Donner votre avis sur le site web mathworks.fr A partir de cette page vous arrivez sur le formulaire suivant :

tell us what you think

où j’ai pu sélectionner l’item Broken Link. Une fois tous les champs remplis , on vous demande de valider une dernière fois :

website feedback

puis on vous remercie , c’est cool non? !!!

site feedback

Exemple simple pour utiliser TriScatteredInterp

Ici je suppose que ma plaque fait 10 mètres de long sur 6 de large , que je connais la température sur cette plaque sur 8 points. Pour avoir une idée de comment se propage la température sur cette plaque je dois donc interpoler ces points.

Commencons par créer notre figure et notre dataset:

%% Figure sans menu et sans numéro :
figure(‘name’,’Interpolation avec TriScatteredInterp’,’numbertitle’,’off’,’menubar’,’none’)

%% Température connue sur 8 points
x = [0 1 2 4 7 8 9 10]'; % longueur allant de 0 à 10
y = [0 3 5 2 1.5 1 1 6]'; % largueur allant de 0 à 6
temperature = [12 20 98 45 12 0 14 60]'; % 8 valeurs de température

Ensuite créons notre maillage et notre interpolant :

%% Création du maillage : 1 point tous les 10 cm
[Xinterp,Yinterp] = meshgrid(min(x):0.1:max(x),min(y):0.1:max(y));

%% Création de l’interpolant
F = TriScatteredInterp(x,y,temperature);
% Evaluons cet interpolant en (Xinterp,Yinterp).
% Les valeurs correspondantes à ces points est Zinterp:
Zinterp = F(Xinterp,Yinterp);

A ce stage là Xinterp, Yinterp et Zinterp sont des matrices 61*101. Normal vu qu’il faut 61 bâtons tous les 10 cm entre 0 et 6 mètres et 101 bâtons espacés de 10 cm entre 0 et 10 mètres.
Toujours compliqué ces histoires de bâton et d’intervalles ,enfin bref.
Maintenant il ne nous reste plus qu’à s’occuper de la partie graphique.

Un petit contouring pour commencer :

>> contourf(gca,Xinterp,Yinterp,Zinterp)

contourf

Un petit échiquier pour la route :

>> pcolor(gca, Xinterp,Yinterp,Zinterp);

pcolor

on est bien d’accord on peut pas en rester là !
Du coup ce qu’on va faire c’est qu’on va colorer chaque cellule par une interpolation bilinéaire des couleurs des 4 cotés en utilisant toutes les valeurs de Zinterp.
Rien de compliqué :

>> shading(gca,’interp‘)

shadinginterp

A noter pour les geeks qu’on aurait eu le même résultant en mettant au pcolor les propriétés facecolor à interp et EdgeColor à none. Beh oui car comme tout geek qui se respecte , on sait que par défaut notre pcolor a son facecolor à flat et son EdgeColor à [0 0 0] :)

Beaucoup mieux non?! Bon beh pour finir en beauté on va faire un peu de design.

%% Colorbar avec un titre
col = colorbar;
set(get(col,’title’),’String’,'[degrés]’,’fontweight’,’bold’)
set(gca,’tickdir’,’out’,’fontweight’,’bold’)

%% Design axes
xlabel(‘Longueur (m)’)
ylabel(‘Largeur (m)’)
title(‘Température sur une plaque de 10*6 m’)
box(‘off’)
shg % me fait apparaitre ma figure ;)

Ce qui nous donne en image finale :

TriScatteredInterp

On a bien la température la plus chaude (98 degrés) au point (2,5) .
Pour s’en rassurer il suffirait de taper F(2,5) . Pour connaitre la température en (3,3) par exemple , il suffit de taper F(3,3) qui retourne 56.5 degrés.

Et que vaut la température au point (0,1) ? un NaN , normal vu qu’on n’a pas de valeur interpolée pour ce point. Pour ce cas là on aurait besoin que notre interpolant recouvre toute la plaque. Pareil ce n’est pas compliqué ! Si on veut couvrir tout l’ensemble de notre plaque il faut dire à TriScatteredInterp qu’on veut utiliser la méthode ‘nearest’. Par défaut la méthode est Linear. L’autre méthode est Natural.

>> F = TriScatteredInterp(x,y,temperature,’nearest’);

nearest

Et maintenant on est content de avoir que sur notre plaque en (0,1) , il fait 20.1 degrés !

Bon beh voilà pas compliqué , on aurait pu augmenter ou réduire notre gridding qui était de 10 cm , on aurait pu aussi faire une interpolation linéaire avec une extrapolation au voisin le plus proche , c’est à dire enlever les NaN en sortie de notre interpolant , on aurait pu à la fin se faire plaisir en changeant la colormap par défaut par colormap(flipud(hot)) … Mais bon ce n’était pas le but du billet , je voulais juste vous montrer la simplicité de cette méthode.

Installer le MCR sous Linux

Pour savoir où se trouve votre MCR , il suffit de taper :

>>mcr

The GLNXA64 MCR Installer, version 7.16, is:
/home/ope/data/MATLAB/r2011b/toolbox/compiler/deploy/glnxa64/MCRInstaller.zip
[snip]

Full list of available MCR installers:
/home/ope/data/MATLAB/r2011b/toolbox/compiler/deploy/glnxa64/MCRInstaller.zip

For more information, read your local MCR Installer help.
Or see the online documentation at MathWorks’ web site. (Page may load slowly.)

Si on va au lien suggéré « online documentation » on nous dit de taper unzip MCRinstaller.zip. Mais ça ne marchera pas.
En effet la lettre i de MCRinstaller.zip doit être en majuscule sinon on a le message d’erreur suivant :

>> unzip(‘MCRinstaller.zip’)
Error using checkfilename>validateFilename (line 182)
Function UNZIP was unable to find file ‘MCRinstaller.zip’.

Error in checkfilename (line 50)
[fullfilename, fid] = validateFilename( …

Error in parseUnArchiveInputs (line 82)
[archiveFilename, url] = checkfilename(archiveFilename, validExtensions, …

Error in unzip (line 58)
[zipFilename, outputDir, url, urlFilename] = parseUnArchiveInputs( …

Note : bug remonté à MathWorks aujourd’hui.

Donc moi je conseille de taper ces commandes pour être sur de ne pas se tromper :

x = mcrinstaller;
unzip(x)

Ensuite le même lien dit d’aller dans le répertoire /bin/glnxa64 créé suite au dézippage. Malheureusement c’est encore faux. Dans ce répertoire on trouve plutôt 6 autres fichiers :

libgcc_s.so.1 libinstutil.so libmwinstall.so libnativewebproxy.so libstdc++.so.6 libstdc++.so.6.0.10

Le fichier install se trouve à l’endroit à la racine du répertoire où vous avez dézippé (erreur également remontée à TMW)

Donc dernière commande à taper dans un terminal LInux sans avoir à naviguer où que ce soit:

./install

Bref ce qui est génial en revanche c’est que l’installer nous donne les variables d’environnement qu’il faut mettre à jour :

path compiler

Voilà j’ai réussi à installer le MCR de la 2011b sous /home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716

Dans un prochain billet j’expliquerais comment tester que ça fonctionne.

Tester le MCR

Pour cela j’ai juste écrit une fonction test11.b :

function test11b
fprintf(‘\n ça marche !\n’)

  • 1ère étape je compile:

>>mcc -mv test11

En sortie de la compilation j’obtiens 4 fichiers :

mccExcludedFiles.log
test11 (mon standalone)
readme.txt
run_test11.sh

Le readme.txt explique clairement ce qu’il faut faire avec ces fichiers et je vais vous le démontrer.

  • 2ère étape je teste sans lire le readme.txt:

Mais souventes fois les gens ne lisent pas le fichier readme.txt et ont tendance à vouloir de suite lancer l’exécutable . Et que se passe t-il si on essaie de lancer ./test11b ?
Et beh on aura le message d’erreur classique et populaire :

quefaurs@Ulysse:~$ ./test11b
./test11b: error while loading shared libraries: libmwmclmcrrt.so.7.16: cannot open shared object file: No such file or directory

Concrètement ce message signifie que vous avez peut être installé le MCR mais que Linux ne sait pas où aller le chercher …

  • 3ème étape on ne panique pas !

Pas de panique je vous explique ce qu’il faut faire ! regardons les fichiers sortis de la compil :

mccExcludedFiles.log

Ce que raconte le log :

This file contains the list of various toolbox functions that are not
included in the CTF file. An error will be thrown if any of these functions
are called at run-time. Some of these functions may be from toolboxes
that you are not using in your application. The reason for this is that
these toolboxes have overloaded some methods that are called by your code.
If you know which toolboxes are being used by your code, you can use the -p
flag with the -N flag to list these toolboxes explicitly. This will
cause MATLAB Compiler to only look for functions in the specified toolbox
directories in addition to the MATLAB directories. Refer to the MCC
documentation for more information on this.

Donc ce fichier n’a pas d’intérêt pour ce test.

run_test11.sh

Dans le readme.txt on peut lire:

NOTE: When deploying standalone applications, it is possible
to run the shell script file run_test11b.sh
instead of setting environment variables. See
section 2 « Files to Deploy and Package ».

Attardons nous donc sur le shell script qui a le préfixe « run_ » et l’extension .sh.
Ça c’est vraiment un truc super qui est bien expliqué dans le readme.txt. Ça permet de lancer son standalone sans se préoccuper des variables d’environnement!

  • 4ème étape je lance le shell script

Vu que mon MCR est installé sous /home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716 je n’ai qu’à taper dans un terminal Linux :

quefaurs@Ulysse:~$./run_test11b.sh /home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/

ce qui donne:

quefaurs@Ulysse:~$./run_test11b.sh /home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/
——————————————
Setting up environment variables

LD_LIBRARY_PATH is .:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//runtime/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//bin/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/os/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/server:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/client:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64
ça marche !
quefaurs@Ulysse:~$

A noter que le double slash après le v716 n’est pas requis , un seul suffit. J’ai juste copié collé ce que le .sh retournait.

OK maintenant on peut dire que notre MCR est bien installé et fonctionne correctement

Il ne reste plus qu’à mettre de façon permanente les variables d’environnement LD_LIBRARY_PATH et XAPPLRESDIR comme indiqué dans le readme.txt . Franchement ce fichier porte bien son nom … à une exception près où il est laissé le mot r2010a:

If you have version 7.16 of MCR installed in
/mathworks/home/application/R2010a/v716, run the shell script as:

./run_test11b.sh /mathworks/home/application/R2010a/v716

on s’attendrait plus à R2011b à la place de R2010a mais ce n’est pas grave !

  • 5ème étape je teste les export

Mon but est de plus lancer le shell script run_test11b.sh mais juste test11b.

Allez je vais vous montrer pourquoi il faut être rigoureux dans cette étape. Le readme.txt nous parlait de deux variables d’environnement à mettre à jour pour que ça fonctionne de façon permanente: LD_LIBRARY_PATH et XAPPLRESDIR.

Je vais faire exprès de ne mettre à jour que la première avec la commande export:

quefaurs@Ulysse:~$export LD_LIBRARY_PATH=/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//runtime/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//bin/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/os/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/server:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64/client:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//sys/java/jre/glnxa64/jre/lib/amd64

si je lance maintenant mon executable ALORS QUE je n’ai pas mis à jour XAPPLRESDIR voilà le message que vous obtiendrez:

quefaurs@Ulysse:~$ ./test11b
Warning: latest version of matlab app-defaults file not found.
Contact your system administrator to have this file installed

Donc on n’est pas cons on va mettre aussi cette variable à jour:

quefaurs@Ulysse:~$export XAPPLRESDIR=/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716//X11/app-defaults

et maintenant suspense …

quefaurs@Ulysse:~$ ./test11b
ça marche!

Trop cool !
Et que ce serait-il passer si on avait fait l’inverse , c’est à dire de ne mettre à jour que la variable XAPPLRESDIR et beh on serait choper le premier message d’erreur error while loading shared libraries: libmwmclmcrrt.so.7.16 … logique vu que je n’ai pas indiqué où se trouvait mon MCR.

  • 6ème étape éditer le .bashrc

Bon beh il ne reste plus qu’à balancer ça dans un .bashrc , .cshrc ou .profile comme indiqué dans le … readme.txt!

NOTE: To make these changes persistent after logout on Linux
or Mac machines, modify the .cshrc file to include this
setenv command.

Donc c’est que j’ai fait dans mon .bashrc j’ai rajouté les lignes :

export LD_LIBRARY_PATH=/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/runtime/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/bin/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/sys/os/glnxa64:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/sys/java/jre/glnxa64/jre/lib/amd64/native_threads:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/sys/java/jre/glnxa64/jre/lib/amd64/server:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/sys/java/jre/glnxa64/jre/lib/amd64/client:/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/sys/java/jre/glnxa64/jre/lib/amd64

export XAPPLRESDIR=/home/quefaurs/data/DOWNLOAD_SERVER/MATLAB/MCR_DEPLOYED/l64/r2011b/v716/X11/app-defaults

j’ai sauvé le fichier , ré-ouvert un terminal et lancé ./test11b et ça a marché ! Tous mes exécutables R2011b peuvent être lancés juste en indiquant leur nom.