WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Funktion optionen übergeben um defaultwerte zu überschreib

 

davidarmstrong85
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 24.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2013, 14:53     Titel: Funktion optionen übergeben um defaultwerte zu überschreib
  Antworten mit Zitat      
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.


Wie realisier ich das?

Schon mal Danke für eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.04.2013, 15:54     Titel: Re: Funktion optionen übergeben um defaultwerte zu übersch
  Antworten mit Zitat      
Hallo davidarmstrong85,

Da gibt es eine Menge unterschiedlicher Ansätze.
Die üblichen in Matlab sind:
Code:
YourFunc(Input, OptionalInput);
% Und
YourFunc(Input, 'Parameter1', Value1, ...);

Hierbei kann der "OptionalInput" entweder ein Matlab-Array sein, z.B. wenn man bei SIZE als zweiten Input die gewünschte Dimension angibt, oder ein Struct, welches verschiedene Felder enthält.
Die Parameter/Value-Liste ist z.B. beim SET-Befehl gebräuchlich. Im FileExchange findest Du viel dazu, aber auch Loren's Blog ist wärmstens zu empfehlen: http://blogs.mathworks.com/loren/20.....to-set-function-defaults/, http://blogs.mathworks.com/loren/20.....ing-empty-as-placeholder/.

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?!?

Bei STD ist der zweite Input die Normierung. Gewollt ist hier "std(x, 0, 1)"!
Mit dem folgenden wäre das nicht geschehen:
Code:
s = myStd(x, 'Dim', 1)

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.

Konkrete Lösungen:
Code:
function yourFunc(In1, In2, varargin)
N = 23;
if nargin > 2
  N = varargin{1};
end

Code:
function yourFunc(In1, In2, varargin)
N = 23;
if nargin > 2
  S = varargin{1};
  if isfield(S, 'N')
    N = S.N;
  end
end

Ich habe für meine Programme eine Funktion "DefaultStruct" geschrieben, die Case-insensitive nach Feldnamen sucht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
davidarmstrong85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 24.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2013, 16:15     Titel:
  Antworten mit Zitat      
hi, danke erstmal!

ich habe eben dieses beispiel hier gefunden http://www.math.hu-berlin.de/~lamou.....doc/syntax_algorith1.html

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2013, 17:52     Titel:
  Antworten mit Zitat      
Hallo

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
davidarmstrong

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2013, 21:50     Titel:
  Antworten mit Zitat      
hi, danke für deine hilfe!

ich wollte das problem mit mehreren eingaben über ne switch case abfrage machen:

Code:
if(nargin > 0)
for d=1:2:6
    var=varargin(d);
switch (var)
     case h
     h=varargin(d+1);
     case epsi
     epsi=varargin(d+1);
     case proto
     proto=varargin(d+1);
end


matlab meint da aber varargin(d) wäre kein string, wenn ich mir das ausgebe kommt aber z.b. 'epsi' raus.

woran könnte das liegen?
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2013, 07:31     Titel:
  Antworten mit Zitat      
Hallo Allerseits,

das ist natürlich eine Frage die sich fast jeder einmal stellt. Ich mach es eigentlich fast immer so:

Code:

function myfun(a,b,varargin)

% mögliche Funktionsaufrufe:
% myfun(a,b)
% myfun(a,b,'ParameterName',ParameterValue);
% myfun(a,b,Parameterstruct)

% Festlegen von default Werten
options.c = 0;
options.d = 't';

% Einlesen der optionalen Parameter
if numel(varargin) && isstruct(varargin{1})
    options_user = varargin{1};
else
    param = {varargin{1:2:end}};
    value = {varargin{2:2:end}};
    options_user = cell2struct(value,param,2);
end

% Überschreiben der default Werte
fn = fieldnames(options_user);
for l = 1:numel(fn)
    options.(fn{l}) = options_user.(fn{l});
end

% Ausgabe der Variablen
display(['a = ',num2str(a)]);
display(['b = ',num2str(b)]);
display(['c = ',num2str(options.c)]);
display(['d = ',num2str(options.d)]);
 


Damit ist die Übergabe von optionalen Parametern als Parameter/Value Liste sowie als struct möglich.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.04.2013, 09:53     Titel:
  Antworten mit Zitat      
Zitat:
matlab meint da aber varargin(d) wäre kein string, wenn ich mir das ausgebe kommt aber z.b. 'epsi' raus.

woran könnte das liegen?


Da musst du statt der Runden die geschweifte Klammern verwenden. Sonst übergibst du Cell
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.04.2013, 10:04     Titel:
  Antworten mit Zitat      
Hallo davidarmstrong,

Dein Code hat mehrere Probleme:
Code:
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

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
davidarmstrong85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 24.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2013, 12:38     Titel:
  Antworten mit Zitat      
super, ihr habt mir sehr geholfen! Idea
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.