23

Come posso passare gli argomenti della riga di comando a un eseguibile MATLAB standalone in esecuzione su Linux/UNIX?Come posso passare gli argomenti della riga di comando ad un eseguibile MATLAB standalone in esecuzione su Linux/Unix?

Ho bisogno di compilare il mio script MATLAB come file standalone che può essere eseguito su una macchina senza MATLAB presente. Ha bisogno di essere in grado di lavorare in un modo simile a C di argv[], dove si fa la seguente: Linea

Comando:

myfile argument1.txt argument2.txt 

dove argomento 1 e 2 sono i file di input e di output.

L'esatta sintassi non ha importanza, ma dovrebbe funzionare come argv[]. Qual è una funzione che potrebbe fare questo?


Quello che voglio dire è che ho MATLAB sul mio computer, ma ho bisogno di fare un eseguibile standalone che può essere eseguito su sistemi Unix senza MATLAB su tali computer (si tratta di un cluster, che ha solo MATLAB su un nodo). Devo trovare un modo per far funzionare la varargin senza che MATLAB sia installato sul computer su cui è in esecuzione il programma. Se posso dire a MATLAB di mettere la libreria MATLAB in ogni eseguibile, va bene, a patto che si tratti di un pacchetto standalone completo.

risposta

2

Non è possibile eseguire MATLAB su un computer senza MATLAB. È possibile installare MCR (MATLAB Component Runtime), che è gratuito da installare ed eseguire i programmi MATLAB. Per costruire un eseguibile 'standalone' avrai anche bisogno del compilatore MATLAB.

Una volta che hai tutto questo. MATLAB ha tutti i servizi necessari per gestire gli argomenti della riga di comando nel modo richiesto.

20

Il sito Web MATLAB ha un worked-through example con le istruzioni su come compilare una semplice applicazione e come distribuirla su un altro computer. In sostanza, è necessario installare il MATLAB Compiler Runtime insieme alla propria applicazione; l'installatore per il runtime dovrebbe già essere presente nell'installazione del compilatore MATLAB .

per passare argomenti della riga di comando a un file eseguibile MATLAB, si definisce una singola funzione MATLAB nel file eseguibile: gli argomenti della funzione sono presi dai parametri della riga di comando (il primo parametro di riga di comando è il primo argomento , e così via).

Ad esempio, creare un file echo.m con i seguenti contenuti :

function exitcode = echo(a, b) 

display(a); 
display(b); 

exitcode = 0; 

È possibile quindi compilare questo file ed eseguirlo con echo 1 2 3, e stamperà a=1 b=2.

Si noti che, quando gli argomenti sono presi dalla riga di comando, sono passato alla funzione come stringhe, quindi è necessario convertirli in numeri usando la funzione str2num.Per esempio:

function rc = display_product(a, b) 

a = str2num(a); 
b = str2num(b); 

display(a*b); 

rc = 0; 
+0

E il valore restituito? – guilhermecgs

1

Ho avuto lo stesso problema e cercato una soluzione generica al problema che in uno script, gli argomenti vengono passati come stringhe, ma serviva come scalari o vettori. Supponiamo di avere la seguente funzione

function myfunc(arg1, arg2, varargs) 
end 

e forse vuole essere in grado di chiamare come

myfunc(1, [1 2 3], 'optional1', 2) 

e anche come

myfunc('1', '[1 2 3]', 'optional1', '2') 

modo che si può compilarlo e l'uso sulla riga di comando come

myfunc 1 '[1 2 3]' optional1 2 

Per questo, ho scritto la seguente funzione:

function r=evalArguments(parser, arguments) 
    % Evaluates parsed arguments' values. 
    % Given a parser containing parsed arguments, all string values of the 
    % arguments specified by parameter "arguments" are evaluated 
    % and the complete results is returned in a new struct. 

    r = parser.Results; 
    for j=1:length(arguments) 
     argValue = r.(arguments{j}); 
     if ischar(argValue) 
      r.(arguments{j}) = eval(argValue); 
     end 
    end 
end 

Allora io sono in grado di utilizzare il inputParser in myfunc come questo:

p = inputParser; 
p.addRequired('arg1'); 
p.addRequired('arg2'); 
p.addParameter('optional1', 0); 
p.parse(arg1, arg2, varargin{:}); 
nonStringArguments = {'arg1', 'arg2', 'optional1'}; 
args = evalArguments(p, nonStringArguments); 
... 
x = args.arg1; 
y = args.arg2; 
z = args.optional1; 

Come non ho trovato un out-of-the- scatola per farlo, inserisco questa soluzione qui e spero che possa essere utile anche ad altri. Se c'è un modo migliore per ottenere questo, per favore fatemelo sapere.

Problemi correlati