2011-10-27 28 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' 

诚然,这是一个有点一见钟情很复杂,但我保持这样的事情我的道路上,所以我可以用一个“如果”的一个匿名函数。这种方式可以构建更复杂的匿名函数。