我发现匿名函数非常有用,但很多时候我需要使用循环才能使函数正常工作。例如:
while val<tolerance
.....
end
我知道我可以将函数保存在一个单独的文件中,有时我可以对代码进行矢量化,然后匿名函数可以工作,但在某些情况下很难找到for循环的替代方法。
Matlab文档没有讨论它或说它是不可能的。有任何想法吗?
答案 0 :(得分:7)
Mathworks文件交换上的Functional Programming构造正是您所需要的。这些功能中的每一个都设计用于匿名功能。它们将在关于 Loren on the MATLAB 博客的3部分系列中详细讨论:Part 1,Part 2和Part 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中的循环没有值,因此不能用作匿名函数中的单个可执行语句。此外,仅仅单语句的约束意味着您不能使用循环进行某些计算,然后在匿名函数内使用第二个语句返回一些值。