23

Wie kann ich Befehlszeilenargumente an eine eigenständige MATLAB-Programmdatei übergeben, die auf Linux/UNIX läuft?Wie kann ich Befehlszeilenargumente an eine eigenständige MATLAB-Programmdatei übergeben, die unter Linux/Unix läuft?

Ich muss mein MATLAB-Skript als eigenständige Datei kompilieren, die auf einer Maschine ohne MATLAB ausgeführt werden kann. Es muss in der Lage sein in einer Art und Weise zu arbeiten, ähnlich wie C des argv[], wo Sie wie folgt vor:

Befehlszeile:

myfile argument1.txt argument2.txt 

wo Argument 1 und 2 sind die Ein- und Ausgabedateien.

Die genaue Syntax ist nicht wichtig, aber es sollte funktionieren wie argv[]. Was ist eine Funktion, die dies tun könnte?


Was ich meine ist, dass ich MATLAB auf meinem Computer habe, aber ich brauche, um eine eigenständige ausführbare Datei zu machen, die auf Unix-Systemen ohne MATLAB auf diesen Computern ausgeführt werden können (es ist ein Cluster, das nur MATLAB auf einem Knoten hat). Ich muss einen Weg finden, die Varargin-Funktion zu machen, ohne MATLAB auf dem Computer installiert zu haben, auf dem das Programm läuft. Wenn ich MATLAB sagen kann, dass es die MATLAB-Bibliothek in jede ausführbare Datei einfügen soll, ist das in Ordnung, solange es ein vollständiges Standalone-Paket ist.

Antwort

2

Sie können MATLAB nicht ohne MATLAB auf einem Computer ausführen. Sie können die kostenlos zu installierende MCL (MATLAB Component Runtime) installieren und MATLAB-Programme ausführen. Um eine eigenständige ausführbare Datei zu erstellen, benötigen Sie auch den MATLAB-Compiler.

Sobald Sie alles haben. MATLAB verfügt über alle Funktionen, die Sie benötigen, um Befehlszeilenargumente so zu verarbeiten, wie Sie es benötigen.

20

Die MATLAB-Website enthält eine worked-through example mit Anweisungen zum Kompilieren einer einfachen Anwendung und zum Bereitstellen auf einem anderen Computer. Im Wesentlichen müssen Sie die MATLAB Compiler Runtime zusammen mit Ihrer Anwendung installieren; Das Installationsprogramm für die Laufzeit sollte bereits in Ihrem MATLAB Compiler Installation vorhanden sein. Die Argumente für die Funktion genommen von den Befehlszeilenparametern (der erste Befehlszeilenparameter ist das erste Argument:

um Befehlszeilenargumente auf einen MATLAB ausführbaren Sie definieren eine einzige MATLAB-Funktion in den ausführbaren Gut- , und so weiter).

Erstellen Sie zum Beispiel eine Datei echo.m mit folgenden Inhalt:

function exitcode = echo(a, b) 

display(a); 
display(b); 

exitcode = 0; 

Anschließend können Sie diese Datei kompilieren und führen Sie es mit echo 1 2 3, und es wird a=1 b=2 drucken.

Beachten Sie, dass, wenn Argumente aus der Kommandozeile genommen werden, sind sie an die Funktion übergeben als Saiten, so dass Sie sie zu Zahlen mit der str2num Funktion konvertieren müssen.Zum Beispiel:

function rc = display_product(a, b) 

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

display(a*b); 

rc = 0; 
+0

Was ist mit dem zurückgegebenen Wert? – guilhermecgs

1

hatte ich das gleiche Problem und für eine generische Lösung für das Problem gesucht, die in einem Skript werden die Argumente als Strings übergeben, sondern als Skalar oder Vektoren benötigt. Angenommen, Sie die folgende Funktion

function myfunc(arg1, arg2, varargs) 
end 

und Sie vielleicht in der Lage sein wollen, dass es

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

wie

zu verlangen und auch wie

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

, damit Sie es kompilieren und Verwendung es auf der Kommandozeile wie

myfunc 1 '[1 2 3]' optional1 2 

Dazu schrieb ich die folgende Funktion:

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 

dann die inputParser in myfunc so zu verwenden, ich bin in der Lage:

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; 

Wie ich eine Out-of-the- nicht finden Um dies zu tun, poste ich diese Lösung hier und hoffe, dass sie auch anderen nützlich sein kann. Wenn es einen besseren Weg gibt, um dies zu erreichen, lass es mich wissen.