【问题标题】:Anonymous functions calling functions with multiple output forms匿名函数调用具有多种输出形式的函数
【发布时间】:2012-12-06 10:45:37
【问题描述】:

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

例如,函数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"

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

【问题讨论】:

标签: matlab


【解决方案1】:

直接,不。不幸的是,有许多功能无法通过匿名函数访问,访问多个输出参数就是其中之一。 (我经常发现的另一个问题是您不能在匿名函数中定义 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

现在您应该能够从匿名函数中随意访问替代输出参数了。

【讨论】:

    【解决方案2】:

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

    另外,关于“如果”不能在 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”。用这种方式可以构建更复杂的匿名函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多