Matlab - 用于匿名函数的循环

时间:2011-04-14 08:46:33

标签: matlab for-loop anonymous-function

我对matlab很新,但我知道如何为循环和匿名函数做两件事。现在我想结合这些。

我想写:

sa = @(c) for i = 1:numel(biscs{c}), figure(i), imshow(biscs{c}{i}.Image), end;

但这是无效的,因为matlab似乎只想要换行符作为命令分隔符。我的代码以清晰的方式编写(没有函数头):

for i = 1:numel(biscs{c})
    figure(i)
    imshow(biscs{c}{i}.Image)
end

我寻找一个解决方案,我可以用一个匿名函数在一行中编写它,就像我的第一个例子。如果我能以另一种方式创建该函数,我也会很高兴,只要我不需要为i创建新的函数m文件。

2 个答案:

答案 0 :(得分:18)

匿名函数可以包含多个语句,但不包含显式循环或if子句。多个语句在单元数组中传递,并且一个接一个地进行求值。例如,此函数将打开一个数字并绘制一些数据:

fun = @(i,c){figure(i),imshow(imshow(biscs{c}{i}.Image)}

然而,这并不能解决循环问题。幸运的是,有ARRAYFUN。有了这个,您可以按如下方式编写循环:

sa = @(c)arrayfun(@(i){figure(i),imshow(biscs{c}{i}.Image)},...
         1:numel(biscs{c}),'uniformOutput',false)

方便地,此函数还返回figureimshow的输出,即相应的句柄。

答案 1 :(得分:9)

如果从另一个函数调用此函数,可以在main函数的.m文件的末尾定义它,然后使用@name语法引用它。但是,这不适用于脚本文件,因为它们不能包含子函数。

第二种方法有点脏,但仍然有效,并且使用eval STRING:

fun = @(a,b) eval('for i = 1:a; imshow(b(i)); end');

如果脚本文件允许以某种方式定义子函数,那将是很好的,但这不太可能。