2011-04-14 64 views
15

我對matlab很新,但我知道如何做循環和匿名函數。現在我想結合這些。Matlab - for循環in anonymus函數

我想寫:

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 

我尋找一個解決方案,無論是我可以在像我第一個例子單線匿名函數寫。如果我可以用另一種方式創建這個函數,我也會很高興,只要我不需要一個新的函數m-file for i。

回答

17

匿名函數可以包含多個語句,但不包含顯式循環或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,即各自的手柄輸出。

8

如果您從另一個函數調用此函數,您可以在主函數的.m文件的末尾定義它,然後使用@name語法引用它。但是,這不適用於腳本文件,因爲它們不能包含子函數。

第二種方法是有點髒,但仍然可能會奏效,並使用eval STRING:

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

這將是巨大的,如果腳本文件可允許的子功能的定義莫名其妙,但這種可能性不大。