匿名函数调用具有多个输出形式的函数

时间:2011-10-27 19:16:31

标签: matlab

我正在尝试定义一个匿名函数,该函数调用返回多个输出的函数版本。

例如,函数find有两种可能的输出形式:

[row,col] = find(X);

[ind] = find(X);

说我想在匿名函数中选择第一个表单。

我试过了 的 1)

get_columns = @(x) x(2);

2)

get_columns = @(x,y) y;

但是当我打电话时:

get_columns(find(x))

get_columns的第一个版本认为我将find称为[ind] = find(X)而不是[row,col] = find(X);,而第二个版本则以"Not enough input arguments"投诉。

有没有办法触发内部 匿名函数特定输出形式

2 个答案:

答案 0 :(得分: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

现在你应该可以在匿名函数中随意访问替代输出参数。

答案 1 :(得分:3)

上面的get_outputs函数对于简短的匿名函数可能非常有用。很好。

另外,关于“if”不能在MATLAB中使用的注释,这只是部分正确。相同的行为可以很容易地匿名实现。例如,这是一个匿名的if:

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

使用:

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

执行与第一个真实条件对应的动作。例如,这会打印'hello'。

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

当然,乍一看有点复杂,但我在路径上保留了这样的东西,所以我可以在匿名函数中使用“if”。可以用这种方式构建更复杂的匿名函数。