2011-10-27 33 views
8

我試圖定義一個匿名函數,它調用返回多個輸出的函數版本。具有多種輸出形式的匿名函數調用函數

例如,函數find有兩種可能的輸出形式:

[row,col] = find(X); 

[ind] = find(X); 

說我想選擇一個匿名函數內的第一種形式。

我已經嘗試 1)

get_columns = @(x) x(2); 

2)

get_columns = @(x,y) y; 

但是,當我打電話:

get_columns(find(x)) 

的第一個版本210認爲我打電話find[ind] = find(X)而不是[row,col] = find(X);,而第二個人則以"Not enough input arguments"抱怨。

是否有觸發特定輸出形式的函數匿名函數的方法嗎?

+5

您可以創建一個輔助函數來請求兩個輸出。另見http://stackoverflow.com/questions/3096281/skipping-outputs-with-anonymous-function-in-matlab – Jonas

回答

8

直接,沒有。不幸的是,有許多功能無法通過匿名函數訪問,訪問多個輸出參數就是其中之一。 (另一個我經常發現的問題是,你不能在匿名函數中定義一個if聲明,這看起來是Matlab語法的一個侷限,而不是其他任何東西。

function varargout = get_outputs(fn, ixsOutputs) 
output_cell = cell(1,max(ixsOutputs)); 
[output_cell{:}] = (fn()); 
varargout = output_cell(ixsOutputs); 

此功能需要一個功能手柄加輸出指標陣列,並返回索引輸出。

如果你創建這個文件(希望更好的註釋),並把它放在你的路徑上,那麼你就可以訪問find函數的第二個輸出通過定義以下功能

find_2nd = @(x)get_outputs(@()find(x),2) 

現在你可以找到找到它等於1爲

>> find_2nd([4 3 2 1]==1) 
ans = 
    4 

數組的索引和現在你應該能夠隨意從訪問替代輸出參數在匿名函數中。

3

上面的get_outputs函數對於簡短的匿名函數可能非常有用。非常好。

此外,關於在MATLAB中不能使用「if」的評論,這只是部分正確的。相同的行爲可以很容易地匿名實施。舉例來說,這裏是一個匿名的,如果:

anonymous_if = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); 

用途:

out = anonymous_if(condition1, action1, condition2, action2, ...); 

執行對應的第一個真正的條件下的行動。例如,這打印'你好'。

anonymous_if(false, @() disp('hi'), ... % if false, print 'hi' 
      true, @() disp('hello')) % else if true, print 'hello' 

誠然,這是一個有點一見鍾情很複雜,但我保持這樣的事情我的道路上,所以我可以用一個「如果」的一個匿名函數。這種方式可以構建更復雜的匿名函數。