7

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

while val<tolerance
     .....
end

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

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

4

3 回答 3

7

Mathworks 文件交换上的函数式编程结构正是您所需要的。这些函数中的每一个都设计为在匿名函数中使用。在Loren on the Art of MATLAB博客的 3 部分系列中详细讨论了它们:第 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一些初始值val0。此外,假设这StuffDoneEachWhileLoop是一个定义变量val应如何在每个 while 循环中更新的函数。然后:

myFunc = @(n) loop(val0, ...                    % Initialize state
                  @(val) val < tolerance, ...   % OP condition
                  @(val) StuffDoneEachWhileLoop(val));    %  

上述想法的各种扩展是可能的。有关详细信息,请参阅 Tucker McClure 的函数式编程 FEX 提交

于 2013-02-07T03:10:30.790 回答
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

于 2013-02-08T08:55:54.993 回答
0

Matlab 的文档实际上确实讨论了它,但是解释可能被认为有些模糊。从匿名函数文档

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

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

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

于 2013-02-06T23:36:27.920 回答