Scilab 5.4.1 : améliorer les performances catastrophiques des fonctions permute et meshgrid

En répondant à un problème sur le forum Scilab (3D Graphics Scilab), je me suis retrouvé confronté aux performances catastrophiques de la fonction meshgrid.

En en étudiant le code, je me suis rendu compte que le problème venait en fait de la fonction permute appelée deux ou trois fois par meshgrid.

Le problème est connu : Bug #5205 The permute function is really slow on big hypermatrixes

La solution n’est malheureusement pas intégrée dans les binaires de la version 5.4.1

Je vous présente ici une solution en attendant la version 5.5 de Scilab qui devrait, sans aucun doute, intégrer la correction.

Le problème

Voici un simple programme de test :

x = -4:0.25:4;
y = -4:0.25:4;
z = -4:0.25:4;

[X, Y, Z] = meshgrid(x,y,z);

Comme on peut le voir, avec MATLAB et Scilab, les variables X, Y et Z sont de dimension 33x33x33 et leur taille reste faible (287 Ko).

Voici les temps d’exécution de ce code avec MATLAB R2011b (64 bits) et Scilab 5.4.1 (64 bits) sur ma machine équipée d’un processeur Intel Core i7 3770K :

  • MATLAB : 0,0004 secondes
  • Scilab : 7,7 secondes

Je vous épargne le ratio de performance entre MATLAB et Scilab :shock:

La cause

La fonction meshgrid de Scilab fait approximativement ceci :

[x,y,z] = ndgrid(x,y,z);

x = permute(x,[2,1,3]);
y = permute(y,[2,1,3]);
z = permute(z,[2,1,3]);

En testant les temps d’exécution de chaque ligne, on se rend compte que ndgrid est très rapide alors qu’il faut 2,5 secondes pour chaque appel à permute.

Il faut donc trouver une alternative à permute.sci livré avec Scilab.

La solution

Sur la page du Bugzilla de Scilab mentionnée en début de ce billet, on trouve un lien vers une version optimisée : permute.sci

Pour récupérer facilement le code, faites un clic droit sur le lien permute.sci (juste au dessus du code sur la page mentionnée précédemment) puis « Enregistrer la cible du lien vers » et renommer le fichier en « permute.sci ».

Mettez ce fichier dans un dossier temporaire nommé « permute »

Avec Scilab, placez vous dans ce dossier temporaire puis exécutez la commande genlib

Par exemple, si le fichier « permute.sci » est enregistré dans un dossier « D:\dev\scilab\tmp\permute », faites ceci :

cd("D:\dev\scilab\tmp\permute")
genlib("permute","D:\dev\scilab\tmp\permute")

Vous obtiendrez un fichier compilé « permute.bin

Fermez Scilab.

Maintenant, rendez-vous dans le sous-dossier « modules\elementary_functions\macros » du dossier d’installation de Scilab

Renommez les fichiers « permute.sci » et « permute.bin » présents dans le dossier « modules\elementary_functions\macros » en « permute.sci.old » et « permute.bin.old »

Pour finir, copiez les fichier « permute.sci » et « permute.bin » que vous avez compilés avec genlib dans le dossier « modules\elementary_functions\macros ».

Voila, ouvrez Scilab et vous utiliserez maintenant les versions optimisées de meshgrid et permute

Conclusion

Pour information, le code Scilab précédent qui s’exécutait en 7,7 secondes, ne prend plus maintenant que 0,063 secondes

C’est nettement mieux

:)

MATLAB Home : offrez-vous MATLAB R2014a à prix réduit pour vos développements perso

MATLAB Home

Avec la récente sortie de MATLAB R2014a, MathWorks propose une nouvelle licence : MATLAB Home

licence MATLAB Home

Vous pouvez maintenant acquérir MATLAB à prix réduit, pour vos développements perso, si cela fait partie de vos hobbies.

Ceux qui trouvent MATLAB trop cher continueront sans doute à se plaindre, et préfèreront toujours les alternatives gratuites comme Scilab ou GNU Octave (voire Python). On peut également entrevoir derrière cette touche de philanthropie, d’autres buts plus mercantiles pour MathWorks.

Néanmoins, en tant qu’utilisateur de MATLAB depuis plus de 10 ans, je ne peux que saluer cette initiative. On pourra juste lui reprocher d’arriver un peu tardivement comparée à d’autres (Mathematica, Maple…) mais, mieux vaut tard que jamais.

Coût

MATLAB sous la nouvelle licence Home coute 105 Euros HT (soit 126 Euros TTC) pour la France. Simulink ainsi que l’ensemble des Toolbox (à l’exception du MATLAB Compiler) sont disponibles au prix unitaire de 29 Euros HT (soit 35 Euros TTC)

Fonctionnalités

La licence MATLAB Home vous donne droit à la même version (R2014a) que les autres licences, sans aucun bridage. Seul le MATLAB Compiler n’est pas disponible, son utilisation est injustifiée dans le cadre de cette licence.

Plateformes prises en charge

La licence MATLAB Home est disponible sur Windows 32 et 64 bits, Linux 64 bits et Mac 64 bits.

Limitation

La licence MATLAB Home vous permet seulement d’utiliser MATLAB dans le cadre de vos développements perso, en amateur dans votre garage. Elle ne s’applique pas aux activités commerciales, de recherche, gouvernementales ou éducatives. Dans ce cas, vous devez utiliser une des licences dédiées à ces usages.

FAQ

Vous trouverez toutes les informations dans la FAQ : http://www.mathworks.fr/products/matlab-home/includes/faq.html

Récupérer la désignation du CPU en ligne de commandes avec Windows, Linux et Mac OS X

Il y a quelques temps déjà, j’avais posté une série de trois billets sur le thème de l’identification de processeur avec MATLAB (1, 2 et 3) dans laquelle j’exposais plusieurs méthodes plus ou moins fiables et portables.

J’ai récemment appris une méthode permettant de récupérer le modèle du processeur avec Mac OS X et, de fil en aiguille, avec Windows. J’ai donc complété le deuxième billet de la série en conséquence.

Voici synthétisées ici, les trois lignes de commandes pour les trois systèmes d’exploitation que l’on trouve majoritairement sur nos machines.

L’information renvoyée est du type :

Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz

Bien entendu, il est possible d’extraire d’autres informations à propos du CPU en utilisant des variantes de ces commandes.

Windows

Avec Windows, il suffit d’utiliser le système de gestion WMI :

for /f "tokens=2 delims==" %A in ('wmic cpu get name /value') do @(echo %A)

Testé avec Windows 7.

Linux

Avec Linux, il suffit d’analyser le contenu de /proc/cpuinfo :

grep -m 1 "model name" /proc/cpuinfo | cut -d: -f2

Testé avec Xubuntu 12.04.

Mac OS X

Avec Mac OS X, il suffit d’utiliser l’interface sysctl :

sysctl machdep.cpu | grep brand_string | cut -d: -f2

Testé avec Mac OS X 10.9