использование циклов for / while в анонимных функциях в Matlab
Я нашел анонимную функцию довольно полезной, но много раз мне нужно будет использовать цикл, чтобы заставить функцию работать. Например:
while val<tolerance
.....
end
Я знаю, что могу сохранить функцию в отдельном файле, и что иногда я могу векторизовать код, а затем анонимная функция может работать, но в некоторых случаях очень трудно найти альтернативу циклу for.
документация Matlab не обсуждает это или не говорит, что это невозможно. Есть идеи?
3 ответов
на Функциональное Программирование конструкции на обмене файлами Mathworks-это именно то, что вам нужно. Каждая из этих функций предназначена для использования в анонимных функциях. Они подробно обсуждаются в серии из 3 частей на Лорен об искусстве MATLAB блог: Часть 1, Часть 2 и Часть 3.
в частности Часть 3 обсуждает реализацию циклов как функцию. Для полнота, я позаимствую часть кода из функциональное программирование представление FEX чтобы продемонстрировать, как в m-коде мы можем использовать цикл while в анонимной функции. Во-первых, определите loop
функция:
function x = loop(x, continueFcn, f)
% Inputs:
% x - Initial state (can be cell array of arguments to f)
% continueFcn - Continue function, returns true iff the loop should go on
% f - Function of the state (x) to run every iteration
while ~continueFcn(x{:})
x = f(x{:});
end
end
для примера предоставить val
wile имеют некоторое начальное значение,val0
сказать. Далее, предположим, что StuffDoneEachWhileLoop
- это функция, которая определяет, как переменная val
должно обновляться в каждом цикле while. Затем:
myFunc = @(n) loop(val0, ... % Initialize state
@(val) val < tolerance, ... % OP condition
@(val) StuffDoneEachWhileLoop(val)); %
различные возможны расширения этой идеи. См. Такера Макклюра функциональное программирование представление FEX для получения дополнительной информации.
Если ваша главная проблема заключается в создании нового файла m каждый раз, когда вы хотите использовать простую функцию, это может быть простым решением для вас.
Если вы пишете функцию, и хотите использовать другую функцию в этой области вам не нужно создать новый файл м. Вместо этого вы можете просто определить вторую функцию, которая доступна локально.
проверить это пример:
function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end
function m = avg(x,n)
m = sum(x)/n;
end
http://www.mathworks.nl/help/matlab/ref/function.html;jsessionid=903a612c197e288e7cf631d7a434
документация Matlab действительно обсуждает это, однако объяснение может считаться несколько расплывчатым. От анонимная документация по функциям:
анонимные функции могут признавать входные сигналы и возвращенные выходы, как раз как стандартные функции. Однако, они могут содержать только a один исполняемый оператор.
то, что я понимаю под "исполняемым оператором", на самом деле является выражением, которое получает некоторые значение.
насколько мне известно, циклы в Matlab не имеют значения и поэтому не могут использоваться как единственный исполняемый оператор внутри анонимной функции. Кроме того, ограничение только один оператор означает, что вы не можете использовать цикл для некоторых вычислений, а затем возвращать некоторое значение со вторым оператором внутри анонимной функции.