использование циклов 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 не имеют значения и поэтому не могут использоваться как единственный исполняемый оператор внутри анонимной функции. Кроме того, ограничение только один оператор означает, что вы не можете использовать цикл для некоторых вычислений, а затем возвращать некоторое значение со вторым оператором внутри анонимной функции.