Анонимная функция матлаб что это
Как выполнить несколько операторов в анонимной функции MATLAB?
Я хотел бы сделать что-то вроде этого:
Итак, когда я сказал:
functionCall1 и functionCall2 не обязательно являются функциями, возвращающими значения.
ОТВЕТЫ
Ответ 1
Попытка сделать все через командную строку без сохранения функций в m файлах может быть сложной и запутанной задачей, но здесь одним из способов я придумал.
Сначала сделайте анонимные функции и поместите их handles в массиве :
. или, если у вас есть уже определенные функции (например, в m файлах), поместите функции в массив ячеек следующим образом:
Затем вы можете создать новую анонимную функцию, которая вызывает каждую функцию в массиве с помощью встроенных функций cellfun и feval :
Несмотря на забавный вид, он работает.
EDIT: Если функции в fcnArray должны быть вызваны с входными аргументами, вам сначала нужно убедиться, что для ВСЕХ функций в массиве требуется ИСТОЧНИЕ количество входов. В этом случае в следующем примере показано, как вызвать массив функций с одним входным аргументом каждый:
Ответ 2
Синтаксис анонимной функции в Matlab (как и некоторые другие языки) допускает только одно выражение. Кроме того, он имеет различную семантику связывания переменных (переменные, которые не входят в список аргументов, имеют свои значения, лексически связанные во время создания функции, а не связанные ссылки). Эта простота позволяет Mathworks делать некоторые оптимизации за кулисами и избегать множества проблем с охватом и проблемами времени жизни при использовании их в сценариях.
Если вы определяете эту анонимную функцию внутри функции (а не script), вы можете создавать именованные внутренние функции. Внутренние функции имеют нормальное лексическое связывание ссылок и позволяют произвольное количество операторов.
Иногда вы можете уйти с трюками, такими как предложение gnovice.
Будьте осторожны с использованием eval. он очень неэффективен (он обходит JIT), а оптимизатор Matlab может запутаться между переменными и функциями из внешней области, которые используются внутри выражения eval. Также сложно отлаживать и/или расширять код, который использует eval.
Ответ 3
Вот метод, который будет гарантировать порядок выполнения и (с модификациями, упомянутыми в конце) позволяет передавать разные аргументы различным функциям.
Тестовый код
Вот тестовый код, который я использовал:
Вызов дополнительных функций
Чтобы вызвать 3 функции, вы можете написать
Для получения дополнительных функций продолжите шаблон вложенности.
Передача аргументов
Вы также можете создавать версии call1, которые принимают несколько аргументов и смешивают и сопоставляют их по мере необходимости.
Ответ 4
Если functionCall1() и functionCall2() возвращают что-то, и эти somethings могут быть объединены, вы можете сделать это:
>> foo = @() [functionCall1(), functionCall2()]
>> foo = @() [functionCall1(); functionCall2()]
Ответ 5
Возможно, используя функцию curly, которая используется для создания списка, разделенного запятой.
Ответ 6
Возможно, мне не хватает somethign, просто создайте функцию combCall, которая вызывает обе функции для вас.
Документация
Анонимные функции
Что такое анонимные функции?
Например, создайте указатель на анонимную функцию, которая находит квадрат номера:
Найдите квадрат особого значения ( 5 ) путем передачи значения указателю на функцию, так же, как вы передали бы входной параметр стандартной функции.
Например, найдите интеграл sqr функция от 0 к 1 путем передачи указателя на функцию integral функция:
Вы не должны создавать переменную в рабочей области, чтобы сохранить анонимную функцию. Вместо этого можно создать временный указатель на функцию в рамках выражения, такого как этот вызов integral функция:
Переменные в выражении
Указатели на функцию могут сохранить не только выражение, но также и переменные, которых выражение требует для оценки.
Чтобы предоставить различные значения для коэффициентов, необходимо создать новый указатель на функцию:
Можно сохранить указатели на функцию и их присваиваемые значения в MAT-файле и загрузить их в последующем сеансе работы с MATLAB с помощью save и load функции, такой как
Несколько анонимных функций
Выражение в анонимной функции может включать другую анонимную функцию. Это полезно для передачи различных параметров к функции, которую вы выполняете в области значений значений. Например, можно решить уравнение
для различных значений c путем объединения двух анонимных функций:
Вот то, как вывести этот оператор:
Запишите подынтегральное выражение как анонимную функцию,
Предоставьте значение для c путем построения анонимной функции для целого уравнения,
Функции без вводов
Если ваша функция не требует никаких входных параметров, используйте пустые круглые скобки, когда вы задаете и вызываете анонимную функцию. Например:
Исключение круглых скобок в операторе присваивания создает другой указатель на функцию и не выполняет функцию:
Функции с несколькими вводами или выводами
Анонимные функции требуют, чтобы вы явным образом задали входные параметры, как вы были бы для стандартной функции, разделяя несколько входных параметров запятыми. Например, эта функция принимает два входных параметров, x и y :
Однако анонимная функция возвращает только один выходной параметр. Если выражение в функции возвращает несколько выходных параметров, то можно запросить их, когда вы вызываете указатель на функцию.
Можно использовать выход от mygrid создать сетчатый график или объемную поверхностную диаграмму:
Массивы анонимных функций
Несмотря на то, что большинство основополагающих типов данных MATLAB поддерживает многомерные массивы, указатели на функцию должны быть скалярами (один элементы). Однако можно сохранить несколько указателей на функцию с помощью массива ячеек или массива структур. Наиболее распространенный подход должен использовать массив ячеек, такой как
Когда вы создаете массив ячеек, имеете в виду, что MATLAB интерпретирует пробелы как разделители столбцов. Или не используйте пробелы от выражений, как показано в предыдущем коде, или заключите выражения в круглые скобки, такой как
Доступ к содержимому ячейки с помощью фигурных скобок. Например, f <1>возвращает первый указатель на функцию. Чтобы выполнить функцию, передайте входные значения в круглых скобках после фигурных скобок:
Похожие темы
Открытый пример
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
Документация MATLAB
Поддержка
© 1994-2021 The MathWorks, Inc.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.
Оптимизация оптимизации в MatLab: nested и anonymous functions
Добрый день!
Я занимаюсь научными исследованиями в области систем управления, и Matlab — мой основной рабочий инструмент. Одна из возможностей в MatLab — численная оптимизация. Оптимизировать (минимизировать) можно любую функцию, которая принимает на вход вектор варьируемых параметров и возвращает значение минимизируемого критерия. Естественно, в процессе оптимизации целевая функция вызывается множество раз и ее быстродействие существенно. В матлабе есть хорошие программные средства, которые часто позволяют существенно улучшить быстродействие, сохранив при этом читаемость и удобство сопровождения кода. Я приведу пример задачи, покажу на нём, что такое anonymous functions и nested functions, а потом покажу, как можно совместить эти два инструмента для заметного повышения быстродействия.
Постановка задачи и оптимизация
Я долго думал над примером для оптимизации, пытался выбрать что-то реалистичное – поиск оптимальной траектории для кинематически избыточного манипулятора, аппроксимация экспериментальных данных, идентификация параметров. Но все это как-то уводило от сути, так что решил остановится на непрактичном, но иллюстративном примере. Итак, заданы параметры a и b. Надо найти x в диапазоне [0;1], максимизирующий критерий:
где — некоторая функция, не зависящая явно от x, но нужная для вычисления критерия. Пусть это будет модуль суммы первого миллиона псевдослучайных чисел, полученных при установка seed в z. Напишем матлабовскую функцию, вычисляющую значение критерия:
Обратите внимание, что возвращаем значение со знаком минус, так как мы хотим найти максимум, а оптимизация ищет минимум.
Теперь для оптимизации при конкретных значениях a и b нам надо сделать анонимную функцию. Делается это так:
Теперь переменная fhnd_GetJ содержит хендл анонимной функции, которая принимает один параметр и позволяет вычислить GetJ(a,b, принятый параметр) для значений a и b, указанных при создании этой анонимной функции. Можно перейти непосредственно к минимизации. Скажем, мы хотим найти оптимальное значение x с точностью до 1 милионной:
Функция fminbnd(fun,x_min,x_max) минимизирует скалярную функцию скалярного аргумента на интервале [x_min; x_max]. Здесь fun — хендл оптимизируемой функции. При выполнении оптимизации функция GetJ вызывается 12 раз, это можно увидеть, задав в опциях параметр ‘Display’ как ‘iter’ – покажет все итерации. На моем компе оптимизация занимает, в среднем, 10 мс.
Повышение быстродействия
Конечно, это считается намного быстрее. Оптимизация проходит, в среднем, за 0.8 мс. Но платой за это является ухудшение кода. Разрывается целостность функционала – вычисление phi_a и phi_b самостоятельной ценности не имеет и в отрыве от вычисления J не нужно. Если где-то в другом месте опять потребуется считать J(a,b,x), уже не для оптимизации, а просто так, то придется вместо простого вызова GetJ за собой таскать еще и вычисление phi_a и phi_b или делать отдельно функции для оптимизации, отдельно для вычислений. Ну и просто не очень красиво.
Хорошо, что у матлаба есть способ обойти эту ситуацию. Для этого давайте создадим nested function внутри функции GetJ :
Nested function nf_GetJ видит все переменные в области видимости родительской функции и, в принципе, понятно, что и как она делает. Пока что мы никакого выигрыша по быстродействию не получили – все те же 10 мс на оптимизацию.
А теперь самое интересное – матлаб умеет работать с anonymous nested function. Вместо конкретного значения наша функция GetJ может вернуть хендл на собственную вложенную функцию. И при вызове функции по этому хендлу родительская функция выполняться не будет, но ее область видимости с посчитанными параметрами останется! Запишем:
И выполняется такая оптимизация за 0,8 мс.
MATLAB — Функции
Функция — это группа операторов, которые вместе выполняют задачу. В MATLAB функции определены в отдельных файлах. Имя файла и функции должны совпадать.
Функции могут принимать более одного входного аргумента и могут возвращать более одного выходного аргумента.
Синтаксис оператора функции —
пример
Создайте файл функции с именем mymax.m и введите в него следующий код —
Строки комментариев, которые идут сразу после оператора функции, содержат текст справки. Эти строки печатаются при вводе —
MATLAB выполнит приведенный выше оператор и вернет следующий результат —
Вы можете вызвать функцию как —
MATLAB выполнит приведенный выше оператор и вернет следующий результат —
Анонимные функции
Анонимная функция похожа на встроенную функцию в традиционных языках программирования, определенную в одной инструкции MATLAB. Он состоит из одного выражения MATLAB и любого количества входных и выходных аргументов.
Вы можете определить анонимную функцию прямо в командной строке MATLAB или в функции или скрипте.
Таким образом, вы можете создавать простые функции без необходимости создавать файл для них.
Синтаксис для создания анонимной функции из выражения:
пример
В этом примере мы напишем анонимную функцию с именем power, которая будет принимать два числа в качестве входных данных и возвращать первое число, возведенное в степень второго числа.
Создайте файл сценария и введите в нем следующий код —
Когда вы запускаете файл, он отображает —
Основные и подфункции
Любая функция, кроме анонимной, должна быть определена в файле. Каждый файл функции содержит требуемую первичную функцию, которая появляется первой, и любое количество необязательных подфункций, которые идут после основной функции и используются ею.
Первичные функции могут быть вызваны из-за пределов файла, который их определяет, либо из командной строки, либо из других функций, но подфункции не могут быть вызваны из командной строки или других функций вне файла функции.
Подфункции видны только основной функции и другим подфункциям в файле функций, который их определяет.
пример
Напишем функцию с именем quadratic, которая будет вычислять корни квадратного уравнения. Функция будет принимать три входа: квадратичный коэффициент, линейный коэффициент и постоянный член. Это вернуло бы корни.
Создайте файл функции quadratic.m и введите в него следующий код —
Вы можете вызвать вышеуказанную функцию из командной строки как —
MATLAB выполнит приведенный выше оператор и вернет следующий результат —
Вложенные функции
Вы можете определить функции в теле другой функции. Это так называемые вложенные функции. Вложенная функция содержит любой или все компоненты любой другой функции.
Вложенные функции определены в области действия другой функции и имеют общий доступ к рабочему пространству содержащей функции.
Вложенная функция имеет следующий синтаксис:
пример
Перепишем функцию quadratic из предыдущего примера, однако на этот раз функция диска будет вложенной функцией.
Создайте файл функции quadratic2.m и введите в него следующий код —
Вы можете вызвать вышеуказанную функцию из командной строки как —
MATLAB выполнит приведенный выше оператор и вернет следующий результат —
Частные функции
Закрытая функция — это основная функция, которая видна только ограниченной группе других функций. Если вы не хотите показывать реализацию функции (й), вы можете создать их как частные функции.
Они видны только функциям в родительской папке.
пример
Перепишем квадратичную функцию. На этот раз, однако, функция диска, вычисляющая дискриминант, будет частной функцией.
Создайте подпапку с именем private в рабочем каталоге. Сохраните в нем следующий файл функции disc.m —
Создайте функцию quadratic3.m в вашем рабочем каталоге и введите в нее следующий код:
Вы можете вызвать вышеуказанную функцию из командной строки как —
MATLAB выполнит приведенный выше оператор и вернет следующий результат —
Глобальные переменные
Глобальные переменные могут совместно использоваться более чем одной функцией. Для этого вам нужно объявить переменную как глобальную во всех функциях.
Если вы хотите получить доступ к этой переменной из базовой рабочей области, объявите переменную в командной строке.
Глобальное объявление должно произойти до того, как переменная будет фактически использована в функции. Рекомендуется использовать заглавные буквы для имен глобальных переменных, чтобы отличать их от других переменных.
пример
Давайте создадим файл функции с именем medium.m и наберем в нем следующий код:
Создайте файл сценария и введите в нем следующий код —
Когда вы запустите файл, он покажет следующий результат —
Русские Блоги
Функция MatLab (2)
Обзор
Возьмите в своевременное примечание MatLab как можно больше.
Этот контент сообщает усовершенствованные части функций в MatAlb.
Принцип функций MatLab
Для функции MatLab это похоже на черный ящик, пользователь должен только знать использование функции, не зная, как функция реализована внутри. Когда главная программа работает, компьютер открывает другое пространство памяти. После того, как функция находится внутри, запустите команду функции, после работы функции автоматически восстанавливает это пространство памяти, за исключением всех функций содержимого, кроме вывода. Параметры больше не существуют.
Обязательно помните: все, что вы делаете внутри функции, не будет никакого влияния на снаружи.
Следующие функции являются случай
Запустите следующую команду
Вы можете заменить X основной программы «x = x + 1;» внутри функции (x = x + 1; «просто щелкните область после крайней левой линии номер каждой строки, то есть красная точка останова отображается. Нажмите еще раз, чтобы отменить точку останова). При запуске он будет приостановлен в рамках функции, а рабочая область может найти x = 1 внутри функции. Нажмите «Продолжить» на панели инструментов, чтобы продолжать работать. См. Основная программа все еще A = 1.
Видно, что переменные внутри функции «невидимы» в основной программе, и переменные в основной программе не могут использоваться внутри функции. Аналогично, основная программа не может использовать переменные внутри функции. Следовательно, «связь» функции и основная программа зависит от входных параметров и выходных параметров.
Посеряя переменные, используемые функцией, и результат рассчитывается из результата.
MATLAB Дополнительные параметры
Многие функции MATLAB имеют множество гибких методов входных данных, которые поддерживают различное количество входных параметров и параметров вывода, таких как общие функции нулевых нулевых нулей, могут создавать нулевые матрицы разных размеров в соответствии с различным количеством входных параметров. Эта гибкость основана на необязательных параметрах в функции MATLAB.
Дополнительные параметры, предоставленные MATLAB, следующие:
Образец 1: Выполните разные операции для разных входных параметров
Иногда используйте дополнительные параметры Nargin для функции, чтобы иметь различные моды вызова. Аналогичные параметры Nargout используются при использовании различных мод вызова для различных выходных параметров.
Выполнить следующую команду
Образец 2: Выполните разные операции для неизвестных параметров количества
Иногда функция вызова даже не знает, сколько у входных параметров есть, что я должен распоряжаться? В это время Varargin может использоваться для получения любых входных параметров, доступа к соответствующим входным параметрам через Varargin
Точно так же вы также можете назначить значение VARARGOUT
Образец 3: Проверьте количество входных параметров
Аналогичным образом используются три режима вызовов
Аналогичным образом, вы также можете использовать Nargoutchk для проверки параметра выходных данных, кроме того, попробуйте придать вашу подходящую функцию вызова.
Образец 4: имя переменной введено функцией
Вы можете захотеть имя переменной, введенное функцией, которая определенно известна. Почему вы все еще создаете такую функцию? Эта функция имеет роль.
Эта функция может быть строгла в пакет на основе соответствующего типа переменного.
MATLAB Функция Другие типы
Другие типы функций, идентифицируемых MATLAB, включают четыре типа:
Анонимная функция
Частичная функция
Локальная функция также называется подпунктом, эквивалентной аксессуаре функции полной функции. После написания локальной функции это функция присоединения функции после последней строки функции. Это означает, что частичная функция ограничена: можно назвать только другие функции в одном и том же файле, что не видно для других функций и командных строк.
В частности, если вы привыкли пропустить конец конца функции, вам следует гарантировать подзуистым и основную функцию в том же формате в одном файле.
Вложенная функция
Частная функция
Предположим, что текущий рабочий путь «/ xxx», создайте «частную» подпапку в папке XXX, вы можете указать функцию в качестве частной функции. Таким образом, только функции в папке XXX могут вызывать эту личную функцию.
резюме
Содержание этой функции также приходит в абзац. В дополнение к содержимому функции MATLAB, существует дополнительная точка для отладки точки останова (быстро прервать и зарезервировать прерывание), позвольте ускорить шаги отладки).