Archives du mot-clé Scilab

Utiliser Automation depuis Scilab sur Windows

Automation (anciennement OLE Automation) permet la communication entre différents logiciels (processus) sur Windows. Cela permet par exemple de faire communiquer MATLAB avec Excel (voir Contrôle d’Excel par MATLAB via Automation).

Avec MATLAB, il suffit d’utiliser la fonction actxserver. Il n’y a pas de fonction équivalente fournie avec la version de base de Scilab. Il faut installer un module complémentaire « ole » qui se trouve sur la forge Scilab (What is the Forge ?).

Téléchargement du module « ole »

Le code source du module « ole » est disponible à cette adresse : http://forge.scilab.org/index.php/p/ole/

Les fichiers sources sont disponibles soit en format zip : ole-master.zip, soit via un dépôt Git avec la commande git clone git://git.forge.scilab.org/ole.git

Une fois le code source téléchargé, il faut maintenant le compiler.

Compilation du module « ole »

Vous devez tout d’abord vérifier qu’un compilateur Microsoft de la suite Visual Studio est installé. Ouvrez Scilab et exécutez la commande suivante :

-->compiler = findmsvccompiler()

Si aucun nom de compilateur n’est renvoyé, vous devez en installer un.
Par exemple : Microsoft Visual Studio 2012 Express

Une fois que vous avez un compilateur opérationnel, placez-vous dans le dossier où se trouvent les fichiers sources du module « ole » et exécutez la commande suivante :

-->exec builder.sce;

Scilab doit renvoyer :

Création des macros...
-- Création de [automationlib] (Macros) --
genlib : Traitement du fichier : %VARIANT_e.sci
genlib : Traitement du fichier : %VARIANT_p.sci
genlib : Traitement du fichier : %VARIANT_size.sci
genlib : Traitement du fichier : %ptr_p.sci
genlib : Traitement du fichier : ole_getOlePath.sci
genlib : Régénère les noms et les bibliothèques

Il est maintenant possible de charger le module dans Scilab :

-->exec loader.sce;
Start Automation for Scilab
    Load gateways
    Load macros

Vous pouvez maintenant utiliser la fonction ole_actxserver (comme la fonction MATLAB actxserver). Par exemple pour interfacer Scilab avec Excel :

Excel = ole_actxserver("Excel.Application")

Vous trouverez différents tests dans le fichier « examples.sce ». Tous ne fonctionneront peut être pas en fonction des éléments de Windows installés ou non sur votre machine. N’exécutez donc pas le script en entier, mais faîtes plutôt des copier/coller des blocs de code susceptibles de fonctionner.

Erreur « ‘VCExpress.exe’ n’est pas reconnu… » avec Visual Studio 2012 Express

A la compilation avec Visual Studio 2012 Express, Scilab renvoi le message suivant :

!'VCExpress.exe' n'est pas reconnu en tant que commande interne   !
!                                                                 !
!ou externe, un programme exécutable ou un fichier de commandes.  !

Depuis la version 2012, l’exécutable ne se nomme plus « VCExpress » mais « WDExpress ». Ouvrez le fichier « builder.sce » et modifiez le bloc suivant :

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "VCExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

en

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "WDExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

Exécutez à nouveau « builder.sce »

Conclusion

Voila, vous pouvez maintenant faire appel à automation depuis Scilab pour communiquer entre différents processus Windows.

Et vous ?

  • Avez-vous déjà utilisé Automation avec Scilab ?
  • Dans quel but ?
  • Avez-vous rencontré des problèmes ?

Sortie de Scilab 5.5.0 !

Scilab Enterprises vient tout juste d’annoncer la sortie de Scilab 5.5.0 (Windows, Linux et Mac)

Logo Scilab 5.5.0

La construction des IHM et l’interaction avec les graphiques semblent avoir été améliorées dans cette version.

Je ne manquerai pas de tester tout ça et de faire un retour dans un prochain billet.

:arrow: Téléchargez Scilab 5.5.0

:arrow: Consultez la Release Note pour la liste de toutes les nouveautés et des corrections de bugs.

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

:)