Ist es möglich, Standardargumente in Matlab zu haben? Zum Beispiel hier:
function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))
Ich möchte, dass die wahre Lösung ein optionales Argument für die Wellenfunktion ist. Wenn es möglich ist, kann jemand den richtigen Weg zeigen, dies zu tun? Derzeit versuche ich, was ich oben gepostet habe und bekomme:
??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.
if nargin
Statemens), wartungsfreundlich, kompakt und flexibel.Ein anderer etwas weniger hackiger Weg ist
quelle
Ja, es könnte wirklich schön sein, die Fähigkeit zu haben, das zu tun, was Sie geschrieben haben. In MATLAB ist dies jedoch nicht möglich. Viele meiner Dienstprogramme, die Standardeinstellungen für die Argumente zulassen, werden am Anfang mit expliziten Überprüfungen wie folgt geschrieben:
Ok, also würde ich im Allgemeinen eine bessere, aussagekräftigere Fehlermeldung anwenden. Beachten Sie, dass die Prüfung auf eine leere Variable es dem Benutzer ermöglicht, ein leeres Klammerpaar [] als Platzhalter für eine Variable zu übergeben, die ihren Standardwert annimmt. Der Autor muss dennoch den Code angeben, um dieses leere Argument durch seinen Standardwert zu ersetzen.
Meine komplexeren Dienstprogramme mit VIELEN Parametern, die alle Standardargumente haben, verwenden häufig eine Eigenschaft / Wert-Paar-Schnittstelle für Standardargumente. Dieses grundlegende Paradigma wird in den Handle-Grafik-Tools in Matlab sowie in Optimset, Odeset usw. gesehen.
Um mit diesen Eigenschafts- / Wertepaaren arbeiten zu können, müssen Sie sich mit Varargin vertraut machen, um eine vollständig variable Anzahl von Argumenten in eine Funktion eingeben zu können. Ich habe ein Dienstprogramm geschrieben (und veröffentlicht), um mit solchen Eigenschaft / Wert-Paaren zu arbeiten, parse_pv_pairs.m . Es hilft Ihnen, Eigenschafts- / Wertepaare in eine Matlab-Struktur zu konvertieren. Außerdem können Sie für jeden Parameter Standardwerte angeben. Das Konvertieren einer unhandlichen Liste von Parametern in eine Struktur ist eine SEHR gute Möglichkeit, sie in MATLAB weiterzugeben.
quelle
Dies ist meine einfache Möglichkeit, mit "try" Standardwerte für eine Funktion festzulegen:
Grüße!
quelle
Ich habe festgestellt, dass die Funktion parseArgs sehr hilfreich sein kann.
quelle
Es gibt auch einen 'Hack', der verwendet werden kann, obwohl er möglicherweise irgendwann aus dem Matlab entfernt wird: Die Funktion eval akzeptiert tatsächlich zwei Argumente, von denen das zweite ausgeführt wird, wenn beim ersten ein Fehler aufgetreten ist.
So können wir verwenden
um den Wert 1 als Standard für das Argument zu verwenden
quelle
Ich glaube, ich habe einen ziemlich raffinierten Weg gefunden, um mit diesem Problem umzugehen, indem ich nur drei Codezeilen (mit Ausnahme von Zeilenumbrüchen) verwendet habe. Das Folgende wird direkt von einer Funktion entfernt, die ich schreibe, und es scheint wie gewünscht zu funktionieren:
Ich dachte nur, ich würde es teilen.
quelle
Ich bin verwirrt, dass niemand auf diesen Blog-Beitrag von Loren, einem der Entwickler von Matlab, hingewiesen hat . Der Ansatz basiert auf
varargin
und vermeidet all diese endlosen und schmerzhaftif-then-else
oderswitch
Fälle mit gewundenen Bedingungen. Wenn es einige Standardwerte gibt, ist der Effekt dramatisch . Hier ist ein Beispiel aus dem verlinkten Blog:Wenn Sie es immer noch nicht verstehen, lesen Sie den gesamten Blog-Beitrag von Loren. Ich habe einen nachfolgenden Blog-Beitrag geschrieben, der sich mit fehlenden Positionsstandardwerten befasst . Ich meine, du könntest so etwas schreiben wie:
und haben immer noch den Standardwert
eps
für dentol
Parameter (und@magic
Rückruf fürfunc
natürlich). Lorens Code erlaubt dies mit einer kleinen, aber kniffligen Modifikation.Zum Schluss noch einige Vorteile dieses Ansatzes:
if-then-else
Standardeinstellungen wird der Boilerplate-Code nicht riesig (im Gegensatz zur Familie der Ansätze, die mit jedem neuen Standardwert länger werden).Trooth gesagt, es gibt auch einen Nachteil. Wenn Sie die Funktion in die Matlab-Shell eingeben und ihre Parameter vergessen, wird eine nicht hilfreiche Funktion
varargin
als Hinweis angezeigt. Um damit umzugehen, wird empfohlen, eine aussagekräftige Verwendungsklausel zu schreiben.quelle
Nachdem ich ASSIGNIN (dank dieser Antwort von b3 ) und EVALIN kennengelernt hatte, schrieb ich zwei Funktionen, um endlich eine sehr einfache Aufrufstruktur zu erhalten:
Hier ist die Auflistung:
und
quelle
Dies ist mehr oder weniger aus dem Matlab-Handbuch entnommen . Ich habe nur vorübergehende Erfahrung ...
quelle
Matlab bietet hierfür keinen Mechanismus, aber Sie können einen im Userland-Code erstellen, der kürzer als die Sequenzen inputParser oder "if nargin <1 ..." ist.
Dann können Sie es in Ihren Funktionen wie folgt aufrufen:
Die Formatierung ist eine Konvention, mit der Sie von Parameternamen auf ihre Standardwerte herunterlesen können. Sie können Ihre getargs () mit optionalen Parametertypspezifikationen (zur Fehlererkennung oder impliziten Konvertierung) und Argumentanzahlbereichen erweitern.
Dieser Ansatz weist zwei Nachteile auf. Erstens ist es langsam, sodass Sie es nicht für Funktionen verwenden möchten, die in Schleifen aufgerufen werden. Zweitens funktioniert die Funktionshilfe von Matlab - die Hinweise zur automatischen Vervollständigung in der Befehlszeile - nicht für Varargin-Funktionen. Aber es ist ziemlich praktisch.
quelle
Möglicherweise möchten Sie den
parseparams
Befehl in matlab verwenden. Die Verwendung würde folgendermaßen aussehen:quelle
zB
f(2,4,'c',3)
bewirkt, dass der Parameterc
3 ist.quelle
Wenn Sie Oktave verwenden würden, könnten Sie dies so tun - aber leider unterstützt Matlab diese Möglichkeit nicht
(aus dem Dokument entnommen )
quelle
Ich mache das gerne etwas objektorientierter. Speichern Sie vor dem Aufruf von wave () einige Ihrer Argumente in einer Struktur, z. man nannte Parameter:
Überprüfen Sie dann innerhalb der Wave-Funktion, ob die Strukturparameter ein Feld namens 'flag' enthalten und wenn ja, ob sein Wert nicht leer ist. Weisen Sie ihm dann einen Standardwert zu, den Sie zuvor definiert haben, oder den Wert, der als Argument in der Parameterstruktur angegeben ist:
Dies erleichtert die Verarbeitung einer großen Anzahl von Argumenten, da dies nicht von der Reihenfolge der angegebenen Argumente abhängt. Es ist jedoch auch hilfreich, wenn Sie später weitere Argumente hinzufügen müssen, da Sie dazu die Funktionssignatur nicht ändern müssen.
quelle
wave(a,b,'flag',42,'fTrue',1)