2016-06-02 6 views
4

Vor dem Release R2016a ist publishingder Weg in MATLAB, um die Ergebnisse eines Skripts zu dokumentieren. Ich finde, wenn ich ein Skript manuell ausführe, platziere ich häufig pause Befehle in meinem Skript. Gibt es eine einfache Möglichkeit festzustellen, ob ein Skript veröffentlicht wird oder nicht? Dann kann ich meine Pausen in einem Stück Code wie wickeln:Programmgesteuert bestimmen, ob ein Skript normal veröffentlicht oder ausgeführt wird

if isNotPublishing 
    pause(); 
end 

Mein google foo hat mich im Stich gelassen in eine Lösung dieses Problems zu finden.

Antwort

5

Ein einfacher Weg, dies zu tun, ist zu sehen, ob publish im Call-Stack ist. dbstack gibt ein Array von struct s zurück, die angeben, welche Funktionen in welcher Reihenfolge aufgerufen wurden, um zu dem Punkt zu gelangen, an dem wir dbstack aufrufen. Wir können die name Eigenschaft verwenden, um uns die Namen aller dieser Funktionen zu nennen und zu sehen, ob publish unter ihnen ist. Wenn dies der Fall ist, nehmen wir an, dass das Skript über publish aufgerufen wurde.

stack = dbstack; 
isBeingPublished = ismember('publish', {stack.name}); 

Oder wenn Sie wollen, dass ein Einzeiler sein

isBeingPublished = ismember('publish', cellfun(@(x)x.name, dbstack, 'UniformOutput', 0)); 

Dies sollte funktionieren, ob Sie Ihr Skript veröffentlichen die Symbolleiste oder über die Befehlszeile mit

publish('myscript.m') 
veröffentlichen mit

Wenn Sie wirklich schick werden wollten, könnten Sie pause überlasten (oder schreiben Sie Ihre eigene Version, mypause), die thi tut s check für dich. Das funktioniert, weil innerhalb Ihrer neuen pause Funktion dbstack immer noch publish enthält, weil Sie es aus Ihrem Skript aufgerufen haben, das schließlich von publish ausgewertet wurde. Wenn Sie diese Funktion erstellen, benötigen Sie nicht die gesamte Logik in Ihrem Code und können stattdessen einfach mypause() aufrufen.

function mypause(varargin) 
    stack = dbstack; 
    if ~ismember('publish', {stack.name}); 
     builtin('pause', varargin{:}) 
    end 
end 
+2

Schöne Antwort! Ein Kommentar/eine Warnung für alle, die mit MATLAB nicht vertraut sind. Mit MATLAB können Sie die Namen von Parameterpaaren kürzen (http://stackoverflow.com/q/25907412/2338750), wenn sie in weniger Buchstaben eindeutig identifiziert werden können. Also, 'uni, 0' ist die Abkürzung für' UniformOutput, false'. Die Fallstricke sind: Wenn Mathworks entscheidet, dass sie ein "UniformInput", "UniqueOutput", "niversal" oder ähnliches wollen, werden alle Codes mit "uni" fehlschlagen. Ich würde daher vorschlagen, dass Sie immer die Zeit nehmen, den vollständigen Namen für Parameterpaare zu schreiben. –

+0

@StewieGriffin Großartiger Punkt. Ich benutze immer '' uni '' aus Gewohnheit, werde mich aber definitiv bemühen, es auszudrücken. Vielen Dank. – Suever

+0

In meiner Matlab-Bibliothek Startfunktion habe ich: cu = @ (f, x) cellfun (f, x, 'UniformOutput', false); Reinigt Code, wie Sie es nicht glauben würden. – John