【问题标题】:Matlab - for loop in anonymus functionMatlab - 匿名函数中的for循环
【发布时间】:2011-08-05 08:42:54
【问题描述】:

我对 matlab 还很陌生,但我知道如何处理 for 循环和匿名函数。现在我想把这些结合起来。

我想写:

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-file。

【问题讨论】:

    标签: matlab for-loop anonymous-function


    【解决方案1】:

    匿名函数可以包含多个语句,但不能包含显式循环或 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 的输出,即各自的句柄。

    【讨论】:

      【解决方案2】:

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

      第二种方法有点脏,但可能会起作用,并且是使用 eval STRING:

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-23
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2017-01-23
        • 2016-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多