2011-07-20 17 views
48

Jak mogę zadeklarować funkcję w MATLAB z opcjonalnymi argumentami?Opcjonalne argumenty w funkcjach MATLAB

Na przykład: function [a] = train(x, y, opt), gdzie opcja musi być opcjonalnym argumentem.

+1

możliwe duplikat [Argumenty domyślne w Matlab] (http://stackoverflow.com/questions/795823/ default-arguments-in-matlab), [Odpowiednik Matlaba Pythona "None"] (http://stackoverflow.com/questions/1737523/the-matlab-equivalent-of-pythons-none), [Jak radzić sobie z par nazwy/wartości argumentów funkcji w MATLAB] (http://stackoverflow.com/questions/2775263/how-to-deal-with-name-value-pairs-ofunction-arguments-in-matlab) – Amro

+1

Dobre dyskusje tego h http://blogs.mathworks.com/pick/2010/04/02/setting-default-values/ i tutaj http://blogs.mathworks.com/loren/2009/05/05/nice-way-to -set-function-defaults / –

Odpowiedz

34

Istnieje kilka różnych opcji, jak to zrobić. Najbardziej podstawowym jest użycie varargin, a następnie użycie nargin, size itd. W celu ustalenia, czy opcjonalne argumenty zostały przekazane do funkcji.

% Function that takes two arguments, X & Y, followed by a variable 
% number of additional arguments 
function varlist(X,Y,varargin) 
    fprintf('Total number of inputs = %d\n',nargin); 

    nVarargs = length(varargin); 
    fprintf('Inputs in varargin(%d):\n',nVarargs) 
    for k = 1:nVarargs 
     fprintf(' %d\n', varargin{k}) 
    end 

Nieco bardziej eleganckie rozwiązanie patrząc jest użycie klasy inputParser zdefiniowanie wszystkich argumentów oczekiwanych przez funkcję, zarówno obowiązkowe i fakultatywne. inputParser umożliwia również wykonywanie sprawdzania typów we wszystkich argumentach.

36

Prostym sposobem na to jest via nargin (N argumentów w). Minusem jest upewnienie się, że lista argumentów i sprawdzenia nargin są zgodne.

Warto pamiętać, że wszystkie wejścia są opcjonalne, ale funkcje wyjdą z błędem, jeśli wywoła zmienną, która nie jest ustawiona. Poniższy przykład ustawia wartości domyślne dla b i c. Wyjdzie, jeśli nie jest obecny.

function [ output_args ] = input_example(a, b, c) 
if nargin < 1 
    error('input_example : a is a required input') 
end 

if nargin < 2 
    b = 20 
end 

if nargin < 3 
    c = 30 
end 
end 
32

Dobrym sposobem będzie o to, aby nie używać nargin, ale aby sprawdzić, czy zmienne zostały ustawione przy użyciu exist('opt', 'var').

Przykład:

function [a] = train(x, y, opt) 
    if (~exist('opt', 'var')) 
     opt = true; 
    end 
end 

Zobacz tę odpowiedź dla profesjonalistów to zrobić w ten sposób: How to check whether an argument is supplied in function call?

Powiązane problemy