#matlab #anonymous-function
#matlab #anonymous-функция
Вопрос:
У меня есть анонимная функция типа @(x) sqrt(x) 1./sqrt(x) - 3
, которую я хочу передать другой функции, например
fsolve(@(x) sqrt(x) 1./sqrt(x) - 3, 3)
Представьте, что аргумент sqrt
sqrt(...)
немного сложнее и, следовательно, sqrt(x)
вызов сложен для вычисления — можно ли создать анонимную функцию, которая сначала вычисляет (в этом простом примере), а затем использует результат res
для вычисления res 1/res - 3
?
Или это можно запрограммировать только с помощью обычной функции?
Комментарии:
1. одно замечание: я хочу использовать это также для генерации кода (встроенный кодировщик), поэтому я должен посмотреть, какие решения поддерживаются встроенным кодировщиком..
2. Вы знаете,
fsolve
нужен дескриптор функции, но это не обязательно должна быть анонимная функция. Вы можете написать реальную функцию, которую вы можете вставить в конец M-файла, который ее использует, и передать ей дескриптор.
Ответ №1:
Если ваша идея о вложенной анонимной функции идет в направлении «все в пределах одной анонимной функции без промежуточных шагов» (т. Е. промежуточных анонимных функций), я не могу придумать решение, поскольку вам нужно каким-то образом «сохранить» значение, чтобы предотвратить его повторное вычисление. Итак, моя идея была бы следующей:
% Original function
orig = @(x) sqrt(x) 1./sqrt(x) - 3;
% Complicated inner function
inner = @(x) sqrt(x);
% Actual function
func = @(y) y 1./y - 3;
% Function wrapper
wrapper = @(z) func(inner(z));
% Some small tests
X = 1:10;
orig(X)
wrapper(X)
ans =
-1.000000 -0.878680 -0.690599 -0.500000 -0.316718 -0.142262 0.023716 0.181981 0.333333 0.478505
ans =
-1.000000 -0.878680 -0.690599 -0.500000 -0.316718 -0.142262 0.023716 0.181981 0.333333 0.478505
Сложная внутренняя функция вычисляется только один раз — по крайней мере, с моей точки зрения.
Ответ №2:
Да, вы можете это сделать (хотя является ли это действительно эффективным решением вашей реальной проблемы, может быть предметом обсуждения).
По сути, вы хотите определить внутреннюю анонимную функцию, а затем немедленно оценить ее с результатом некоторого дорогостоящего вызова функции.
MATLAB обрабатывает определение анонимной функции внутри определения анонимной функции точно так, как вы ожидаете, что синтаксис позволит вам. Бит «оценивать немедленно» можно выполнить с помощью feval
:
@(x) feval(@(res) res 1./res - 3, sqrt(x))