Verfasst am: 24.04.2013, 14:53
Titel: Funktion optionen übergeben um defaultwerte zu überschreib
Hallo,
ich bin gerade dabei bzw. habe meine Wunschfunktion bereits implementiert. Nur bisher habe ich es so gemacht, dass gewisse Parameter(wie z.b. wie lange eine schleife dauern soll) fest in der Funktion verankert habe.
Nun will ich es aber so haben, dass ich der Funktion Optionen übergeben kann. Also das diese Defaultwerte überschrieben werden können.
Bisher habe ich ein struct in dem ich die Defaultwerte stehen habe.
Mein Ziel ist es jetzt, dass ich der Funktion Werte übergebe, mit denen ich bestimmte Werte der Defaultwerte überschreiben kann.
In der Parameter/Value-Liste spielt die Reihenfolge keine Rolle, was vor vielen Bugs schützt. So gibt es bei angefügten optionalen Inputs immer wieder Verwechselungen:
Code:
x = rand(2, 10);
m = mean(x, 1)% Mean along 1st dimension
s = std(x, 1)% Std along first dimension?!?
Aber das Parsen der Parameter/Value-Liste würde in diesem Fall 100 mal länger dauern als die eigentliche Berechnung. Deshalb wird dies bei elementaren Funktionen nicht eingesetzt.
nun habe ich aber zwei probleme: 1. wenn ich den ganzen kram so wie er da steht nehme und z.b. algorithl(1,1,'epsi',0.0005) kommt zwar kein fehler, der wert von epsi ändert sich aber auch nicht.
und wenn ich nur algorithl(1,1) aufrufe kommt der fehler
index exceeds matrix dimensions
if (strcmp(varargin(1),'h')~=0
ansich finde ich den code logisch und er würde auch gut bei meinem problem passen, aber warum funktioniert er nicht?
weil der Autor den Fehler in einer IF-Bedingung gemacht hat:
und zwar in der Zeile if (nargin==2)
zu 1) Hier werden 4 Übergabeparameter übergeben, die Bedingung wird nicht erfühlt, deswegen wird die Zuweisung nie ausgeführt
zu 2) Jetzt übergibst du 2 Parameter, die Bedingung ist nun erfüllt, dann geht weiter zu IF STRCMP und hier crasht der Code, weil die VARARGIN leer ist.
Da wäre if (nargin>2) besser gewesen.
oder if length(varargin)==2 richtiger gewesen
Mit dieser Funktion kann man nur eine Option auf einmal übergeben/verändern. Um mehre Optionen auf einmal zu verändern, wird der Code aber schwer erweiterbar sein.
davidarmstrong
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.04.2013, 21:50
Titel:
hi, danke für deine hilfe!
ich wollte das problem mit mehreren eingaben über ne switch case abfrage machen:
if(nargin > 0) for d = 1:2:6% d läuft bis 6, auch wenn nargin nur 2 ist? % Besser (dann ist übrigens nicht mal der Test "if nargin>0" erforderlich!): for d = 1:nargin var = varargin(d);
% "var" ist eine Builtin-Funktion. Das führt immer wieder zu Problemen. % Ausserdem ist var nun ein Cell. Besser:
v = varargin{d}; % Geschweifte Klammern! switch(v) case 'h' % Mit Quotes!
h = varargin{d+1}; % Geschweifte Klammern! case 'epsi'
epsi = varargin{d+1};
case 'proto'
proto = varargin{d+1};
otherwise % Immer, immer, immer ein OTHERWISE! Für den Normalfall kostet % es keine Rechnenzeit, weil es nicht aufgerufen wird. Falls man sich % vertippt hat, spart es Stunden oder Wochen Debug-Zeit!!! error('Parameter not recognized: %s', v);
end
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.