我正在尝试定义一个匿名函数,该函数调用返回多个输出的函数版本。
例如,函数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"
投诉。
有没有办法触发内部 匿名函数的特定输出形式?
答案 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”。可以用这种方式构建更复杂的匿名函数。