2014-11-26 17 views
5

Da Matlab interpretiert wird, verbringen Sie normalerweise zu Beginn der Funktion, die die Funktionssignatur erzwingt, viel Zeit. Zum BeispielWann sollte assert() in Matlab verwendet werden?

if nargin ~= 2; error('must provide two input args a and b'); end 
if a < 0||a ~=floor(a); error('input arg1 must be positive non-zero integer'); end 
if ~isa(b,'cell') ... 

Ist es besser zu bedienen ist Matlab assert() für diese Stelle? Wenn nicht, wann ist der geeignete Zeitpunkt, um in Matlab assert() zu verwenden?

Es gibt eine große Diskussion über die Verwendung von Assert in Produktionscode here, aber ich bin mir nicht sicher, dass dies für interpretierten Code gilt. Ebenso, eine andere gute Diskussion here und ich stimme @Dan Dyer in Bezug auf behaupten, um den Glauben an den aktuellen Zustand auszudrücken. Allerdings, wenn man eine ähnliche Diskussion für Python here Leute sagen, verwenden Sie nur für Situationen, die nie passieren sollte (wie Ausnahmen für Ausnahmefälle) behaupten, die ein wenig widersprüchlich ist w.r.t. die vorherigen Referenzen.

Vielleicht ist dies eher eine Frage über die Rolle, die Assert in interpretierten Sprachen spielt, und weniger über Matlab.

+0

Ich schreibe Matlab-Code, um viel Prototyping zu tun. Ich bin nicht sicher, was der "richtige" Anwendungsfall ist, aber ich gehe im Wesentlichen mit der Interpretation des Glaubensglaubens und verwende sie oft. Ich habe keine Leistungsprobleme bei der Profilerstellung in einer einigermaßen neuen Version von Matlab bemerkt. Ich mag, wie sauber sie im Code sind, um Verhalten häufig zu überprüfen. Allerdings mache ich selten Produktionscode in Matlab :) – adalca

Antwort

3

Zum größten Teil, gibt es keinen Unterschied zwischen

assert(X,...) 

und

if (~X) 
    error(...) 
end 

und Ihre Wahl zwischen ihnen ist eine Sache der Bequemlichkeit oder Stil.

Die Unterscheidung zwischen Nichtproduktions- und Produktionscode in MATLAB-basierten Projekten ist oft nicht identisch mit der Unterscheidung in Projekten, die auf anderen Sprachen basieren.

Dies liegt teilweise daran, wie Sie sagen, MATLAB wird in der Regel eher interpretiert als kompiliert; Es ist zwar möglich, Anwendungen mit dem MATLAB Compiler oder den Builder-Produkten zu erstellen, die zwar nicht streng "kompiliert" sind, aber keinen sichtbaren Quellcode haben und nicht debugged werden können.Für diese Art von Anwendungen müssten Sie Ausnahmen und Fehler genauso sorgfältig behandeln wie bei einer kompilierten Sprache.

Es ist auch teilweise weil "Produktion" bedeutet oft etwas anderes für Projekte, die MATLAB verwenden, als es für Projekte in anderen Sprachen tut; Dies könnte beispielsweise bedeuten, dass der MATLAB-Code automatisch in C für den Einsatz in einem Motorsteuergerät konvertiert wird, oder dass ein MATLAB-Code ein finanzielles Prognosemodell ausführt und Ergebnisse in eine Produktionsdatenbank schreibt.

Es gibt einen speziellen Fall, in dem assert anstelle von if..error..end verwendet werden sollte, wenn Sie mit MATLAB Coder C-Code aus MATLAB-Code generieren. MATLAB Coder prüft assert Anweisungen im MATLAB-Code, um Eigenschaften der Variablen abzuleiten, die er in C konvertieren muss, und kann besseren C-Code generieren, wenn er Fakten über Variablen annehmen kann, die Sie angeben (z. B. Array-Größen und -Typen). Ein letzter Punkt: Für die spezifische Aktivität, die Sie erwähnen, eine Funktionssignatur durchsetzend, würde ich keine Methode verwenden - inputParser ist in der Regel robuster und konsistenter (obwohl ein bisschen ausführlich), aber noch wichtiger, es ermutigt Sie, die Funktion zu entwerfen Unterschrift gut in erster Linie.

+0

Wie habe ich noch nie von inputParser gehört ?! Tolle Infos, sehr geschätzt. –

2

Die Art und Weise Behauptungen MATLAB behandelt bedeutet, dass aus der Sicht des Benutzers gibt es keinen Unterschied zwischen den Aussagen ist:

if error_check == false 
    error('function:state','Error message'); 
end 

und

assert(error_check==false,'function:state','Error message'); 

in der gleichen Ausgabe an den Benutzer gezeigt Beide Ergebnis und dieselben Daten werden in lasterr gespeichert. Beide werden von einem try-catch Block abgefangen. Basierend auf einem sehr schnellen und schmutzigen Test, würde ich vorläufig behaupten, dass assert ~ 5% langsamer als error ist (obwohl dies nicht wirklich einen großen Unterschied in dem großen Schema der Dinge macht). Daher ist der einzige wirkliche Unterschied für den Programmierer/Betreuer des Codes, was es weitgehend zu einer stilistischen Entscheidung macht.

Sowohl assert als auch error haben ihre Vor- und Nachteile. assert sieht ein bisschen sauberer aus und benötigt weniger Platz, aber es ist nicht so offensichtlich, was auf den ersten Blick passiert. Für meinen persönlichen Gebrauch würde ich den error Fall vorziehen, weil ich einen Haltepunkt auf der Linie mit dem Fehleranruf setzen kann, und es bricht nur dort ab, wenn der Fehler geworfen wird - das kann nicht so leicht wie gemacht werden mit der Assert-Nachricht (Sie können dbstop in file if error verwenden, aber das hat möglicherweise seine eigenen Probleme). Ich kann auch Debugging-Code in der if-statement stecken, um Informationen über den Programmstatus vor dem Fehler zu drucken.

2

Eine andere Perspektive für dieses Problem ist die Laufzeit. Normalerweise erwarten Sie, dass Ihr Code fehlerfrei funktioniert. Das bedeutet, dass Sie sich nicht um die Millisekunden kümmern, die Matlab benötigt, um einen Fehler zu erzeugen, sondern nur um den logischen Test.

hier ist der Code, den ich zum Vergleich verwendet:

function o=test 

a = 2; 
o = [0 0]; 

tic; 
if a~=2 
error('a is not 2') 
end 
o(1) = toc; 


tic 
assert(a==2,'a is not 2') 
o(2) = toc; 

jetzt, lassen Sie sich diese Funktion oft genug läuft gute Statistiken zu erhalten:

for i=1:10000 
o(i,:) = test; 
end 
mean(o) 

und die Ergebnisse:

am =

1.0e-05 *

0,0088 0,3548

in der unteren Zeile:

assert viel langsamer als if-else ist.

Verwandte Themen