Можно ли иметь аргументы по умолчанию в 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.
if nargin
статей), простой в обслуживании, компактный и гибкий.Другой менее хакерский способ -
источник
Да, было бы неплохо иметь возможность делать то, что вы написали. Но в MATLAB это невозможно. Многие из моих утилит, допускающих значения по умолчанию для аргументов, как правило, написаны с явными проверками в начале, например:
Хорошо, поэтому я бы обычно использовал более подробное сообщение об ошибке. Обратите внимание, что проверка на пустую переменную позволяет пользователю передать пустую пару скобок [] в качестве заполнителя для переменной, которая примет значение по умолчанию. Тем не менее, автор должен предоставить код для замены этого пустого аргумента его значением по умолчанию.
Мои более сложные утилиты с МНОГИМИ параметрами, каждый из которых имеет аргументы по умолчанию, часто используют интерфейс пары свойство / значение для аргументов по умолчанию. Эта базовая парадигма видна в графических инструментах ручки в Matlab, а также в optimset, odeset и т. Д.
В качестве средства работы с этими парами свойство / значение вам нужно будет узнать о varargin, как о способе ввода полностью переменного числа аргументов в функцию. Я написал (и опубликовал) утилиту для работы с такими парами свойство / значение, parse_pv_pairs.m . Это поможет вам преобразовать пары свойство / значение в структуру Matlab. Это также позволяет вам указать значения по умолчанию для каждого параметра. Преобразование громоздкого списка параметров в структуру - ОЧЕНЬ хороший способ передать их в MATLAB.
источник
Это мой простой способ установить для функции значения по умолчанию, используя команду "try":
С уважением!
источник
Я обнаружил, что функция parseArgs может быть очень полезной.
источник
Существует также «хак», который можно использовать, хотя в какой-то момент он может быть удален из Matlab: функция eval фактически принимает два аргумента, из которых второй запускается, если с первым произошла ошибка.
Таким образом, мы можем использовать
использовать значение 1 по умолчанию для аргумента
источник
Я считаю, что нашел довольно изящный способ справиться с этой проблемой, занимая всего три строки кода (запрет на перенос строк). Следующее извлечено непосредственно из функции, которую я пишу, и, похоже, работает по желанию:
Просто подумал, что поделюсь этим.
источник
Я смущен, что никто не указал на это сообщение в блоге Лорен, одного из разработчиков Matlab. Этот подход основан на
varargin
и избегает всех этих бесконечных и болезненныхif-then-else
илиswitch
случаев с запутанными условиями. Когда есть несколько значений по умолчанию, эффект впечатляет . Вот пример из связанного блога:Если вы все еще не понимаете, попробуйте прочитать всю запись в блоге Лорен. Я написал следующий пост в блоге, в котором говорится об отсутствующих позиционных значениях по умолчанию. Я имею в виду, что вы могли бы написать что-то вроде:
и по-прежнему имеют
eps
значение по умолчанию дляtol
параметра (и@magic
обратный вызов дляfunc
конечно, ). Код Лорена позволяет это с небольшой, но сложной модификацией.Напоследок лишь несколько преимуществ такого подхода:
if-then-else
подходов, которые становятся длиннее с каждым новым значением по умолчанию)Но, надо сказать, есть и недостаток. Когда вы наберете функцию в оболочке Matlab и забудете ее параметры, вы увидите бесполезную
varargin
подсказку. Чтобы справиться с этим, вам рекомендуется написать осмысленное использование.источник
После того, как стало известно о ASSIGNIN (благодаря этому ответу по b3 ) и Evalin я написал две функции , чтобы наконец получить очень простую структуру вызова:
Вот список:
и
источник
Это более или менее взято из руководства Matlab ; У меня лишь мимолетный опыт ...
источник
Matlab не предоставляет механизма для этого, но вы можете создать такой код в пользовательском коде, который короче, чем inputParser или последовательности «if nargin <1 ...».
Затем вы можете вызвать его в своих функциях следующим образом:
Форматирование - это соглашение, которое позволяет вам читать от имен параметров до их значений по умолчанию. Вы можете расширить свой getargs () с помощью дополнительных спецификаций типа параметра (для обнаружения ошибок или неявного преобразования) и диапазонов количества аргументов.
У этого подхода есть два недостатка. Во-первых, он медленный, поэтому вы не хотите использовать его для функций, вызываемых в циклах. Во-вторых, справка по функциям Matlab - подсказки автозаполнения в командной строке - не работают для функций varargin. Но это довольно удобно.
источник
вы можете использовать эту
parseparams
команду в Matlab; использование будет выглядеть так:источник
например,
f(2,4,'c',3)
значение параметраc
равно 3.источник
если бы вы использовали октаву, вы могли бы сделать это так, но, к сожалению, Matlab не поддерживает эту возможность
(взято из документа )
источник
Мне нравится делать это несколько более объектно-ориентированным способом. Перед вызовом wave () сохраните некоторые из ваших аргументов в структуре, например. один называется параметрами:
Затем в волновой функции проверьте, содержат ли параметры структуры поле с именем 'flag', и если да, то не пусто ли его значение. Затем присвойте ему другое значение по умолчанию, которое вы определили ранее, или значение, указанное в качестве аргумента в структуре параметров:
Это упрощает обработку большого количества аргументов, поскольку не зависит от порядка данных аргументов. Тем не менее, это также полезно, если вам нужно будет добавить дополнительные аргументы позже, потому что вам не нужно для этого изменять сигнатуру функций.
источник
wave(a,b,'flag',42,'fTrue',1)