it-swarm.com.de

so beenden Sie ein laufendes Skript in Matlab

Ich schreibe ein lang laufendes Skript in Matlab, z.

tic;
d = Rand(5000);
[a,b,c] = svd(d);
toc;

Es scheint für immer zu laufen. Weil ich im Editorfenster F5 drücke. Ich kann also nicht C-Break drücken, um in der Matlab-Konsole anzuhalten.

Ich möchte nur wissen, wie man das Skript anhält. Ich benutze derzeit den Task-Manager, um Matlab zu töten, was wirklich dumm ist. 

Vielen Dank. 

16
Yin Zhu

In der Matlab-Hilfe wird -.__ angezeigt. Bei M-Dateien, die längere Zeit ausgeführt werden, oder bei eingebauten oder MEX-Dateien, die lange ausgeführt werden, wird die Ausführung von Ctrl + C nicht immer effektiv beendet. Dies geschieht normalerweise auf Microsoft Windows-Plattformen und nicht auf UNIX-Plattformen. Wenn dieses Problem auftritt, können Sie MATLAB dabei unterstützen, die Ausführung zu unterbrechen, indem Sie in Ihre M-Datei beispielsweise eine drawow-, pause- oder getframe-Funktion in eine große Schleife einfügen. Beachten Sie, dass Strg + C möglicherweise weniger ansprechbar ist, wenn Sie MATLAB mit der Option -nodesktop gestartet haben.

Ich glaube nicht, dass es eine Option gibt. Dies geschieht bei vielen Matlab-Funktionen, die komplex sind. Entweder müssen wir warten oder sie nicht benutzen!.

8
S Krishna Kumar

Wenn Strg + C nicht sofort reagiert, weil Ihr Skript zu lang/zu komplex ist, halten Sie es.

Der Befehl break wird nicht ausgeführt, wenn matlab einige seiner tieferen Skripts ausführt, und es wird entweder keine Strg-Sequenz im Puffer protokolliert, oder der Puffer wird unmittelbar vor oder unmittelbar nach Abschluss dieser Codeteile gelöscht. Wenn matlab zurückkehrt, um mehr von Ihrem Skript auszuführen, wird es in beiden Fällen erkennen, dass Sie Strg + C gedrückt halten, und es wird beendet.

Bei länger laufenden Programmen versuche ich normalerweise, einen guten Ort für ein Status-Update zu finden, und ich begleite das immer mit einem gewissen Zeitmaß mithilfe von Tic und Toc. Je nachdem, was ich mache, kann ich Laufzeit, Segmentzeit, irgendeine Art von Durchschnitt usw. verwenden.

Für wirklich lange laufende Programme habe ich festgestellt, dass dies außerordentlich nützlich ist http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message. m

aber es sieht auch so aus, als hätten sie auch neuere Funktionen.

5
Mach

MATLAB reagiert nicht auf Ctrl-C, während eine von Mexiko implementierte Funktion wie svd ausgeführt wird. Wenn MATLAB einen großen Speicherplatz zuweist, reagiert es nicht. Es empfiehlt sich, Ihre Funktionen immer für kleine Datenmengen auszuführen, und wenn alle Testdurchläufe für den tatsächlichen Maßstab ausgeführt werden. Wenn die Zeit ein Problem ist, möchten Sie analysieren, wie viel Zeit jedes Codesegment ausgeführt wird, und auch deren grobe Zeitkomplexität.

4
Memming

Erwägen Sie mehrere Matlab-Sitzungen. Behalten Sie das Hauptsitzungsfenster (das hübsche mit allen Farben, dem Dateimanager, dem Befehlsverlauf, dem Arbeitsbereich, dem Editor usw.), um Dinge auszuführen, von denen Sie wissen, dass sie beendet werden.

Sachen, mit denen Sie experimentieren, sagen Sie, Sie machen mit der Ode-Suite Unordnung, und Sie erhalten viele Warnungen: matrix singular, weil Sie einige Parameter geändert haben und nicht vorhergesagt haben, was passieren würde. Führen Sie sie in einer separaten Sitzung aus:

dos('matlab -automation -r &')

Sie können das beenden, ohne das gesamte Matlab neu starten zu müssen. 

2
Rem

Da Sie den Task-Manager erwähnt haben, werden Sie vermutlich Windows verwenden. Angenommen, Sie führen Ihr Skript im Editor aus. Wenn Sie nicht gleichzeitig mit dem Beenden des laufenden Programms gegen das Beenden des Editors sind, lautet die Tastenkombination zum Beenden eines Prozesses wie folgt:

Alt + F4

(Damit meine ich, drücken Sie gleichzeitig die Tasten "Alt" und "F4" auf Ihrer Tastatur.)

Alternativ, wie in anderen Antworten erwähnt,

Ctrl + C

sollte auch funktionieren, wird aber den Editor nicht verlassen.

1
Parthian Shot

Eine Lösung, die ich angenommen habe - für die Verwendung mit Java-Code, aber das Konzept ist bei mexFunctions das gleiche - nur unordentlicher - besteht darin, einen FutureValue zurückzugeben und dann eine Schleife zu machen, während FutureValue.finished () oder was immer true zurückgibt. Der eigentliche Code wird in einem anderen Thread/Prozess ausgeführt. Einen Versuch einzuwickeln, umzufangen und ein FutureValue.cancel () im catch-Block funktioniert für mich.

Im Fall von mex-Funktionen müssen Sie einen Zeiger (als int) zurückgeben, der auf eine Struktur/ein Objekt zeigt, das alle erforderlichen Daten enthält (nativer Thread-Handler, bool für complete usw.). Im Falle einer eingebauten mexFunction muss Ihre mexFunction diese mexFunction höchstwahrscheinlich im separaten Thread aufrufen. Mex-Funktionen sind schließlich nur DLLs/Shared Objects.

PseudoCode

FV = mexLongProcessInAnotherThread();
try
  while ~mexIsDone(FV);
    Java.lang.Thread.sleep(100); %pause has a memory leak
    drawnow; %allow stdout/err from mex to display in command window
  end
catch
  mexCancel(FV);
end
1
KitsuneYMG

wenn Sie Ihr Matlab unter Linux ausführen, können Sie das Matlab mit dem Befehl linux consule ..__ beenden. Zuerst sollten Sie die PID-Nummer des Matlab anhand dieses Codes ermitteln:

oben

dann können Sie diesen Code verwenden, um matlab zu töten: kill 

beispiel: kill 58056

0
mehdi SH