Как установить значения по умолчанию для параметров функций в Matlab? - PullRequest
117 голосов
/ 28 апреля 2009

Возможно ли иметь аргументы по умолчанию в Matlab? Например, здесь:

function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))

Я бы хотел, чтобы истинное решение было необязательным аргументом для волновой функции. Если это возможно, кто-нибудь может продемонстрировать правильный способ сделать это? В настоящее время я пробую то, что я написал выше, и получаю:

??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.

Ответы [ 16 ]

1 голос
/ 13 мая 2009

Matlab не предоставляет механизм для этого, но вы можете создать его в коде пользовательского пространства, который является более кратким, чем inputParser или последовательности "if nargin <1 ...". </p>

function varargout = getargs(args, defaults)
%GETARGS Parse function arguments, with defaults
%
% args is varargin from the caller. By convention, a [] means "use default".
% defaults (optional) is a cell vector of corresponding default values

if nargin < 2;  defaults = {}; end

varargout = cell(1, nargout);
for i = 1:nargout
    if numel(args) >= i && ~isequal(args{i}, [])
        varargout{i} = args{i};
    elseif numel(defaults) >= i
        varargout{i} = defaults{i};
    end
end

Тогда вы можете вызывать его в своих функциях следующим образом:

function y = foo(varargin)
%FOO 
%
% y = foo(a, b, c, d, e, f, g)

[a, b,  c,       d, e, f, g] = getargs(varargin,...
{1, 14, 'dfltc'});

Форматирование - это соглашение, которое позволяет вам читать имена параметров до значений по умолчанию. Вы можете расширить ваши getargs () с помощью необязательных спецификаций типов параметров (для обнаружения ошибок или неявного преобразования) и диапазонов количества аргументов.

У этого подхода есть два недостатка. Во-первых, он медленный, поэтому вы не хотите использовать его для функций, которые вызываются в циклах. Во-вторых, справка по функциям Matlab - подсказки по автозаполнению в командной строке - не работают для функций varargin. Но это довольно удобно.

1 голос
/ 28 апреля 2009

Это более или менее поднято из руководства Matlab ; У меня только опыт прохождения ...

function my_output = wave ( a, b, n, k, T, f, flag, varargin )
  optargin = numel(varargin);
  fTrue = inline('0');
  if optargin > 0
    fTrue = varargin{1};
  end
  % code ...
end
0 голосов
/ 24 мая 2018

Мне нравится делать это несколько более объектно-ориентированным способом. Перед вызовом wave () сохраните некоторые аргументы в структуре, например. один называется параметрами:

parameters.flag =42;
parameters.fTrue =1;
wave(a,b,n,k,T,f,parameters);

Затем в волновой функции проверьте, содержит ли параметры структуры поле с именем 'flag' и, если да, если его значение не пустое. Затем присвойте ему значение по умолчанию, которое вы определили ранее, или значение, указанное в качестве аргумента в структуре параметров:

function output = wave(a,b,n,k,T,f,parameters)
  flagDefault=18;
  fTrueDefault=0;
  if (isfield(parameters,'flag') == 0 || isempty(parameters.flag)),flag=flagDefault;else flag=parameters.flag; end
  if (isfield(parameter,'fTrue') == 0 || isempty(parameters.fTrue)),fTrue=fTrueDefault;else fTrue=parameters.fTrue; end
  ...
end

Это облегчает обработку большого количества аргументов, потому что это не зависит от порядка данных аргументов. Тем не менее, это также полезно, если вам нужно добавить больше аргументов позже, потому что вам не нужно менять сигнатуру функции, чтобы сделать это.

0 голосов
/ 10 июня 2014

Если бы вы использовали октаву, вы могли бы сделать это так, но, к сожалению, Matlab не поддерживает эту возможность

function hello (who = "World")
  printf ("Hello, %s!\n", who);
endfunction

(взято из документа )

0 голосов
/ 11 октября 2010
function f(arg1, arg2, varargin)

arg3 = default3;
arg4 = default4;
% etc.

for ii = 1:length(varargin)/2
  if ~exist(varargin{2*ii-1})
    error(['unknown parameter: ' varargin{2*ii-1}]);
  end;
  eval([varargin{2*ii-1} '=' varargin{2*ii}]);
end;

например. f(2,4,'c',3) приводит к тому, что параметр c равен 3.

0 голосов
/ 08 октября 2010

вы можете использовать команду parseparams в matlab; использование будет выглядеть так:

function output = wave(varargin);
% comments, etc
[reg, props] = parseparams(varargin);
ctrls = cell2struct(props(2:2:end),props(1:2:end),2);  %yes this is ugly!
a = reg{1};
b = reg{2};
%etc
fTrue = ctrl.fTrue;
...