Matlab - 用于匿名函数的循环

Tar*_*sch 16 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
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nas 18

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

fun = @(i,c){figure(i),imshow(imshow(biscs{c}{i}.Image)}
Run Code Online (Sandbox Code Playgroud)

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

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

方便的是,该功能也返回的输出figureimshow,即,各自的手柄.


Ale*_*lex 9

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

第二种方法有点脏,但仍然可以工作,并且使用eval STRING:

fun = @(a,b) eval('for i = 1:a; imshow(b(i)); end');
Run Code Online (Sandbox Code Playgroud)

如果脚本文件允许以某种方式定义子函数会很好,但这不太可能.