在Matlab中的匿名函数中使用for / while循环

时间:2013-02-06 21:52:59

标签: matlab loops anonymous-function

我发现匿名函数非常有用,但很多时候我需要使用循环才能使函数正常工作。例如:

while val<tolerance
     .....
end

我知道我可以将函数保存在一个单独的文件中,有时我可以对代码进行矢量化,然后匿名函数可以工作,但在某些情况下很难找到for循环的替代方法。

Matlab文档没有讨论它或说它是不可能的。有任何想法吗?

3 个答案:

答案 0 :(得分:7)

Mathworks文件交换上的Functional Programming构造正是您所需要的。这些功能中的每一个都设计用于匿名功能。它们将在关于 Loren on the MATLAB 博客的3部分系列中详细讨论:Part 1Part 2Part 3

特别是Part 3讨论了将循环实现为函数。为了完整起见,我将借用Functional Programming FEX submission中的一些代码来演示如何在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));    %  

对上述想法的各种扩展是可能的。有关详细信息,请参阅Tucker McClure的Functional Programming FEX submission

答案 1 :(得分:1)

如果您每次想要使用简单的功能时都需要创建一个新的m文件,那么这对您来说可能是一个简单的解决方案。

如果您正在编写函数,并且只想在此范围内使用其他函数,则无需创建新的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

答案 2 :(得分:0)

Matlab的文档实际上确实在讨论它,但是解释可能被认为有些模糊。来自anonymous function documentation

  

匿名函数可以接受输入和返回输出,就像   标准功能呢。但是,它们只能包含   单个可执行语句

我在“可执行语句”下理解的实际上是一个获得某些价值的表达式。

据我所知,Matlab中的循环没有值,因此不能用作匿名函数中的单个可执行语句。此外,仅仅语句的约束意味着您不能使用循环进行某些计算,然后在匿名函数内使用第二个语句返回一些值。