2009-10-05 8 views
14

Je souhaite appeler matlab dans bash de manière non interactive et utiliser son résultat en dehors de Matlab.supprimer le message de démarrage de Matlab

Par exemple, j'ai un test.m script

rand(3,4) 
quit 

Quand je surExécuterdans bash

$ matlab -nosplash -nodesktop -nodisplay -r test 
Warning: No window system found. Java option 'MWT' ignored 

         < M A T L A B (R) > 
       Copyright 1984-2008 The MathWorks, Inc. 
        Version 7.7.0.471 (R2008b) 
         September 17, 2008 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 


ans = 

0.8147 0.9134 0.2785 0.9649 
0.9058 0.6324 0.5469 0.1576 
0.1270 0.0975 0.9575 0.9706 

Est-il possible de supprimer le message de début de Matlab et afficher uniquement les résultats aussi sans "ans =".

Remarque Je pose une question générale non seulement pour cet exemple.

Merci pour votre intérêt!

+0

En octave, vous pouvez utiliser l'indicateur '-q'. – sffc

Répondre

9

Vous pouvez utiliser la commande Unix "tail + n" pour supprimer les n premières lignes de sortie. Cet en-tête ressemble à 10 lignes, donc cela le dépouillera.

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10 

C'est un peu fragile, mais, étant donné que les avertissements (comme qu ' « aucun système de fenêtre ») vont se dénudée, et la taille d'en-tête varie en fonction de ce que les avertissements se produisent (et ces avertissements sont diagnostics utiles). En outre, cet avertissement pourrait être sur STDERR au lieu de STDOUT, donc "queue +9" pourrait être ce dont vous avez besoin.

Une approche plus robuste pourrait être de modifier le script Matlab pour écrire dans un fichier séparé en utilisant fopen/fprintf/fclose. De cette façon, l'en-tête, les avertissements, les erreurs, etc. de Matlab seront séparés de la sortie formatée que vous voulez. Pour obtenir la sortie "disp" pour aller à ce handle de fichier séparé, vous pouvez le capturer en utilisant evalc. Le fichier de sortie peut être spécifié en utilisant un argument de test() dans le message -r, et la variable $$ env (le PID du processus de bash) incorporée dans le nom du fichier pour éviter les collisions dans un environnement multiprocessus.

function test(ppid) 
outfile = sprintf('outfile-%d.tmp', ppid); 
fh = fopen(outfile, 'w'); 
myvar = rand(3,4); 
str = evalc('disp(myvar)'); 
fprintf(fh, '%s', str); 
fclose(fh); 

Pour l'invoquer depuis bash, utilisez ce formulaire d'appel. (Peut-être mineures syntaxe des problèmes ici, je n'ai pas une boîte Unix pour tester en ce moment.)

% matlab -nosplash -nodisplay -r "test($$)" -logfile matlab-log-$$.tmp 

Disons que votre PID bash est 1234. Maintenant que vous avez votre sortie dans outfile-1234. tmp et un Matlab se connectent à matlab-log-1234.tmp. Collez-les dans/tmp si vous ne voulez pas être dépendant de pwd. Vous pouvez étendre cela pour créer plusieurs fichiers de sortie à partir d'un seul appel matlab, en économisant les coûts de démarrage si vous avez besoin de calculer plusieurs choses.

+2

Ne devrait-il pas être 'queue -n + 10', avec un' -n'? – elaRosca

+1

Dépend de la version de 'queue'. La syntaxe sans "-n" est une variante plus ancienne, et toujours supportée dans certains endroits, y compris OS X où je travaille. Je l'utilise parce que je suis paresseux et habitué. Y compris le '-n' le rendrait plus portable et probablement plus lisible. –

2

Je vous recommande d'enregistrer la sortie dans un fichier, puis de lire dans ce fichier. Cette approche est légèrement plus compliquée, mais moins fragile à mesure que les formats changent, etc. Cela vous donne beaucoup plus de contrôle. Vous trouverez de nombreux scripts sur le Web pour transformer les fichiers Matlab en un langage hôte différent.

Exemple:

A = randn(3, 2); 
save temp_output.mat A 
# Later, read temp_output.mat in whichever language you desire. 
2

Pour supprimer l'affichage de ans =, vous pouvez utiliser la fonction DISP:

disp(rand(3,4)); 

Pour supprimer ce premier message d'avertissement, vous pouvez essayer d'ajouter l'option -nojvm à voir si ça aide.

Pour supprimer tout le reste, vous pouvez essayer this solution à partir d'un thread de discussion de groupe MathWorks qui résout le même problème.

+1

-nojvm ne supprime pas le message de démarrage, c'est-à-dire " ..." – Tim

+0

@Tim: C'était un type erroné. Je voulais suggérer que cela pourrait aider avec le message d'avertissement. Je vais arranger ça. – gnovice

1

Appel Matlab cette

matlab -nodisplay <test.m &>matlab.output 

déchargera tous les messages de démarrage et d'autres sorties affichées dans le fichier matlab.output (qui peut être nommé quelque chose que vous voulez). Si vous alors (suivant la suggestion de Peter) avez test.m enregistrer le résultat que vous devez un fichier en utilisant

csvwrite('temp_output.txt',A) 

ou une autre fonction de sortie appropriée, vous pouvez lire dans ce fichier et continuer.

11

Essayez d'utiliser le -logfile option de ligne de commande:

-logfile log   - Make a copy of any output to the command window 
         in file log. This includes all crash reports. 

Ensuite, vous pouvez facilement supprimer les premières lignes à l'aide de quelque façon que vous voulez (sed par exemple).Exemple:

matlab.exe -nosplash -nodesktop -nojvm -logfile out.log -r 'rand(3,3), exit' 
sed '1,5d' out.log 

Aussi, si vous exécutez à partir d'un script où vous en avez besoin pour terminer l'exécution avant de continuer, utilisez l'option -wait:

-wait  - MATLAB is started by a separate starter program 
      which normally launches MATLAB and then immediately 
      quits. Using the -wait option tells the starter 
      program not to quit until MATLAB has terminated. 
      This option is useful when you need to process the 
      the results from MATLAB in a script. The call to 
      MATLAB with this option will block the script from 
      continuing until the results are generated. 

Plus d'informations sur le démarrage Matlab les options peuvent être trouvées here, ou dans le matlab pages de référence exécutables: /Unix

+0

Plus d'informations sur les options de démarrage de MATLAB peuvent être trouvées ici: http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

Questions connexes