Verfasst am: 01.07.2015, 11:59
Titel: Funktion mit optionalen Optionen erstellen
Hallo zusammen
bin gerade dabei eine Funktion zum CurveFitting zu erstellen.
Dazu habe ich einen autogenerierten Code aus der CurveFittingToolbox entsprechend meinen Wünschen angepasst.
Hier der Code:
Code:
function cFit = spline_function(x,y,SmoothingParam,Plot)
% Fit: 'curve fitting with smoothing spline'. [xData, yData] = prepareCurveData( x, y );
% Set up fittype and options.
ft = fittype( 'smoothingspline' );
opts = fitoptions( ft );
opts.SmoothingParam = SmoothingParam;
opts.Normalize = 'on';
% Fit model to data.
cFit = fit( xData, yData, ft, opts );
% Plot fit with data. ifPlot == 'On';
f = figure( 'Name', 'curve fitting with smoothing spline' );
set(f,'Units','normalized','Position',[0.2, 0.1, 0.605, 0.55]);
h = plot(cFit,'--r',xData,yData,'-b');
legend( h, 'Datenreihe', 'smoothing spline', 'Location','NorthEast' );
xlabel( 'x' );
ylabel( 'y' );
end
Nun wurde ich gerne die Parameter SmoothingParam und Plot optional machen.
Da das wohl niemand versteht, hier ein paar Beispiele wie ich die Funktion gerne aufrufen würde:
% Smoothing Parameter: Default / Plot: Default
test = spline_function(x,y)
% Plot: Default
test = spline_function(x,y,'SmoothingParam',0.8)
% SmoothingParameter: Default
test = spline_function(x,y,'Plot','On')
% außerdem soll die Reihenfolge der optionalen Parameter egal sein
test = spline_function(x,y,'SmoothingParam',0.8,'Plot','On')
test = spline_function(x,y,'Plot','On','SmoothingParam',0.8)
Ein Problem bleibt dabei die Groß-Klein-Schreibung. Der Benutzer darf nicht darüber stolpern, wenn er "plot" mal klein schreibt. Das automatisch abzufangen ist nicht einfach und man schreibt besser eine eigene Funktion dazu. Eine Fehlermeldung hilft aber auch schon weiter:
Dies ist übrigens tückisch:
ifPlot == 'On';
! Der == Operator vergleicht elementweise. Wenn "Plot" den Wert 'off' hat, stehen rechts und links unterschiedlich viele Elemente. Strings vergleicht man mit
strcmp
, oder hier noch besser
strcmpi
.
Benutze einen anderen Namen als "Plot". Eine Regel ist Flags mit "do..." oder "is..." zu beginnen um lesbar deutlich zu machen, wozu die Flags dienen.
ifany(strcmp(inpName,optionNames))
options.(inpName) = pair{2};
else error('%s is not a recognized parameter name', inpName) end end
% Set up fittype and options.
ft = fittype( 'smoothingspline' );
opts = fitoptions( ft );
opts.SmoothingParam = options.smoothingparameter;
opts.Normalize = 'on';
% Fit model to data.
cFit = fit( xData, yData, ft, opts );
% % Plot fit with data.
possiblePlotOptions = {'on';'On';'oN';'ON'};
ifany(strcmp(options.plot,possiblePlotOptions))==1;
f = figure( 'Name', 'curve fitting with smoothing spline' );
set(f,'Units','normalized','Position',[0.2, 0.1, 0.605, 0.55]);
h = plot(cFit,'--r',xData,yData,'-b');
legend( h, 'Datenreihe', 'smoothing spline', 'Location','NorthEast' );
xlabel( 'x' );
ylabel( 'y' );
end
Beim späteren Funktionsaufruf ist es aber völlig egal ob ich nun smoothingparameter, SmoothingParameter oder SmOoThInGpArAmEtEr schreibe
Gibt es dafür denn eine Erklärung?
du verwendest in dem Code den Befehl
lower
, der alles in Kleinbuchstaben umwandelt. Es geht übrigens sogar einen Schritt weiter:
validatestring
vervollständigt automatisch, sobald dies eindeutig möglich ist.
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.