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 definieren, optionale Argumente mit inputParser

 

12Heiko
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2014, 21:09     Titel: Funktion definieren, optionale Argumente mit inputParser
  Antworten mit Zitat      
Hallo zusammen,

Ich möchte eine Funktion definieren, die die sin- und cos-Funktion zusammen in einem Schaubild plottet. Optional soll das Doppelte der sin- und cos-Funktion ebenfalls im selben Schaubild erscheinen können.
Die Funktion soll also ungefähr so aussehen:
Code:
meinPlot(x,y, doppeltX, doppeltY)


wobei x (y) ein Vektor für die sin (cos) Funktion ist. doppeltX und doppeltY sind boolesche Werte, die angben, ob die optionalen Funktionen ebenfalls geplottet werden sollen. Default soll „false“ sein.

Ich hab da jetzt aber Schwierigkeiten, das mit den optionalen Werten hinzubekommen. Ich benutze den inputParser-Ansatz.
Mein Code ist:
Code:

function meinPlot(x,y, doppeltX, doppeltY)

p = inputParser;

defaultDoppelterPlot = 'false';
validDoppelterPlot = {'true','false'};
checkFinish = @(x) any(validatestring(x,validDoppelterPlot));

addRequired(p,'x',@isnumeric); %für die verlangten Inputs
addRequired(p,'y', @isnumeric);

addParamValue(p,'doppeltX',defaultDoppelterPlot,checkDoppelterPlot); % ich habe auch addParameter probiert und p.addParamValue ohne das p in Klammer
addParamValue(p,'doppeltY',defaultDoppelterPlot, checkDoppelterPlot);

hold on
plot(sin(x));
plot(cos(y));

switch doppeltX
case isempty(doppeltX)
case ‘true’
plot(2*sin(x));
otherwise
disp(‘Es wird nur true oder false akzeptiert’);
end

switch doppeltX
case isempty(doppeltX);
case ‘true’
plot(2*sin(x));
otherwise
disp(‘Es wird nur true oder false akzeptiert’);
end
end

 


Leider funktioniert das nicht. Was mich noch mehr überrascht ist, dass ich mit der Funktion addParamValue eigentlich es folgendermaßen eingeben sollte:
Code:

meinPlot(x,y, ‘doppeltX‘, ‘true‘)
 


Wenn ich das aber mache, heißt die Fehlermeldung, dass es zu viele Argumente gibt und wenn ich nur x und y einbeziehe, sind es zu wenig. Dabei sollte es ja gerade funktionieren mit der Funktion addParamValue, weil sie sich ja optionalen Werten widmet.
Habt ihr zufällig eine Idee? Wäre euch dankbar Smile

Habt einen schönen Abend. lg Heiko
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2014, 07:45     Titel:
  Antworten mit Zitat      
Code:

function meinPlot(x,y,varargin)  % varargin verwenden

p = inputParser;

defaultDoppelterPlot = 'false';
validDoppelterPlot = {'true','false'};
checkFinish = @(x) any(validatestring(x,validDoppelterPlot));

addRequired(p,'x',@isnumeric); %für die verlangten Inputs
addRequired(p,'y', @isnumeric);

addParamValue(p,'doppeltX',defaultDoppelterPlot,@ischar); % ich habe auch addParameter probiert und p.addParamValue ohne das p in Klammer
addParamValue(p,'doppeltY',defaultDoppelterPlot, @ischar);

% parse methode muss verwendet werden
p.parse(x,y,varargin{:})

% Variablen werden in dem struct p.Results gespeichert


hold on
plot(sin(p.Results.x));
plot(cos(p.Results.y));

switch p.Results.doppeltX
case 'false'
case 'true'
plot(2*sin(x));
otherwise
disp('Es wird nur true oder false akzeptiert');
end


end
 


Schau dir die Dokumentation zu inputParser noch einmal an. Da sind noch mehrere Fehler drin:
1) du musst im Funktionsaufruf varargin verwenden
2) die Funktion checkDoppelterPlot exisitiert nicht
3) der Aufruf der parse Methde fehlt. Dadurch werden die Argumente in dem struct p.Results gespeichert. Entsprechend musst du den restlichen Code anpassen.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
12Heiko
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2014, 10:01     Titel: exzellent!!
  Antworten mit Zitat      
Funktioniert einwandfrei, vielen Dank dafür!! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
12Heiko
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2014, 11:55     Titel: optionale Einträge entweder @isnumeric oder einen def.Strin
  Antworten mit Zitat      
Angenommen, ich möchte einen weiteren optionalen Input hinzufügen, der einen (einzigen) String zulassen soll, sowie numerische Werte. Wenn ich also z.B. den String ‘dasDoppelteX‘ schreibe, soll es mir die Funktion 2* sin(x) plotten. Wenn ich allerdings den numerischen Wert num eingebe, soll es num*sin(x) plotten. Intuitiv würde ich meinen Code in etwa so setzen. Habt ihr eine Idee? Very Happy

Code:

defaultZusaetzlicherPlot = ‘dasDoppelteX‘
validZusaetzlicherPlot = [{‘dasDoppelteX‘}; @isnumeric];
addParamValue(p, ‘ZusaetzlicherPlot‘, defaultZusaetzlicherPlot, validZusaetzlicherPlot)

switch p.Results.ZusaetzlicherPlot
case ‘dasDoppelteX‘
plot(2*sin(x));
case isnumeric(p.Results.ZusaetzlicherPlot) %oder vielleicht double?
plot(p.Results.ZusaetzlicherPlot*sin(x));
case isstring(p.Results.ZusaetzlicherPlot) && ~= ‘dasDoppelteX’
msg= ‘Als String-Eintrag ist nur “dasDoppelteX” zugelassen‘
end

 
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.