我对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文件。
答案 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)
方便地,此函数还返回figure
和imshow
的输出,即相应的句柄。
答案 1 :(得分:9)
如果从另一个函数调用此函数,可以在main函数的.m文件的末尾定义它,然后使用@name语法引用它。但是,这不适用于脚本文件,因为它们不能包含子函数。
第二种方法有点脏,但仍然有效,并且使用eval STRING:
fun = @(a,b) eval('for i = 1:a; imshow(b(i)); end');
如果脚本文件允许以某种方式定义子函数,那将是很好的,但这不太可能。