Как я устанавливаю значения по умолчанию для параметров функций в Matlab?

Я закончил тем, что использовал решение, подобное тому, что опубликовал @ExcessJudgement. Спасибо, что соединили эту кодовую ручку, кстати! Я создал эту функцию:

jumpToSelection: function(){
    this.$nextTick(() => {
      let selected = this.selected[0];
      let page = Math.ceil((this.products.indexOf(selected) + 1) / this.pagination.rowsPerPage);
      this.pagination.sortBy = "id";
      this.$nextTick(() => {
        this.pagination.page = page;
      });
    });
  }

Я не уверен, почему мне нужно было поместить это в $ nextTick (), но иначе это не сработало бы. Если у кого-то есть понимание этого, было бы полезно узнать, почему это так.

Второй метод $ nextTick () был необходим, поскольку при обновлении sortBy страница не вызывала обновления страницы, и, поскольку я нахожу страницу на основе идентификатора, мне нужно убедиться, что она отсортирована правильно, прежде чем прыгать страницы. Немного запутанный, но он работает.

120
задан nbro 29 May 2018 в 21:47
поделиться

6 ответов

Не существует прямого способа сделать это, как вы пытались.

Обычный подход - использовать «varargs» и проверять количество аргументов. Примерно так:

function f(arg1, arg2, arg3)

  if nargin < 3
    arg3 =   'some default'
  end

end

Есть несколько причудливых вещей, которые вы можете сделать с isempty и т. Д., И вы можете посмотреть на Matlab central для некоторых пакетов, которые объединяют такие вещи.

Вы может взглянуть на varargin , nargchk и т. д. Они полезные функции для такого рода вещей. varargs позволяет вам оставить переменное число конечных аргументов, но это не поможет вам решить проблему значений по умолчанию для некоторых / всех из них.

145
ответ дан 24 November 2019 в 01:37
поделиться

Это более или менее поднято из Руководство по 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
1
ответ дан 24 November 2019 в 01:37
поделиться

I've found that the parseArgs function can be very helpful.

3
ответ дан 24 November 2019 в 01:37
поделиться

Да, было бы очень приятно иметь возможность делать, как ты написал. Но это не возможно в MATLAB. Многие из моих утилит, которые допускают значения по умолчанию для аргументов, как правило, пишутся с явными проверками в начале, как это:

if (nargin<3) or isempty(myParameterName)
  MyParameterName = defaultValue;
elseif (.... tests for non-validity of the value actually provided ...)
  error('The sky is falling!')
end

Хорошо, поэтому я обычно применяю лучшее, более описательное сообщение об ошибке. Обратите внимание, что проверка пустой переменной позволяет пользователю передавать пустую пару скобок [] в качестве заполнителя для переменной, которая примет значение по умолчанию. Автор все еще должен предоставить код для замены этого пустого аргумента значением по умолчанию.

Мои более сложные утилиты с параметрами MANY, все из которых имеют аргументы по умолчанию, часто будут использовать интерфейс пары свойство / значение по умолчанию. аргументы. Эта базовая парадигма видна в графических инструментах дескриптора в Matlab, а также в optimset, odeset и т. д.

В качестве средства для работы с этими парами свойство / значение вам необходимо узнать о varargin, как способ ввода в функцию полностью переменного числа аргументов. Я написал (и опубликовал) утилиту для работы с такими парами свойство / значение, parse_pv_pairs.m . Это поможет вам преобразовать пары свойство / значение в структуру matlab. Это также позволяет вам предоставлять значения по умолчанию для каждого параметра. Преобразование громоздкого списка параметров в структуру - ОЧЕНЬ хороший способ передать их в MATLAB.

parse_pv_pairs.m . Это поможет вам преобразовать пары свойство / значение в структуру matlab. Это также позволяет вам предоставлять значения по умолчанию для каждого параметра. Преобразование громоздкого списка параметров в структуру - ОЧЕНЬ хороший способ передать их в MATLAB.

parse_pv_pairs.m . Это поможет вам преобразовать пары свойство / значение в структуру matlab. Это также позволяет вам предоставлять значения по умолчанию для каждого параметра. Преобразование громоздкого списка параметров в структуру - ОЧЕНЬ хороший способ передать их в MATLAB.

10
ответ дан 24 November 2019 в 01:37
поделиться

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

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
ответ дан 24 November 2019 в 01:37
поделиться

Я использовал inputParser объект для настройки параметров по умолчанию. Matlab не примет формат, подобный Python, который вы указали в вопросе, но вы должны иметь возможность вызывать функцию следующим образом:

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

После того, как вы определите функцию wave следующим образом:

function wave(a,b,n,k,T,f,flag,varargin)

i_p = inputParser;
i_p.FunctionName = 'WAVE';

i_p.addRequired('a',@isnumeric);
i_p.addRequired('b',@isnumeric);
i_p.addRequired('n',@isnumeric);
i_p.addRequired('k',@isnumeric);
i_p.addRequired('T',@isnumeric);
i_p.addRequired('f',@isnumeric);
i_p.addRequired('flag',@isnumeric); 
i_p.addOptional('ftrue',inline('0'),1);    

i_p.parse(a,b,n,k,T,f,flag,varargin{:});

Теперь значения, переданные в функцию, доступны через i_p.Results . Кроме того, я не был уверен, как проверить, что параметр, переданный для ftrue , на самом деле был встроенной функцией, поэтому оставил валидатор пустым.

58
ответ дан 24 November 2019 в 01:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: