如何在匿名函数中使用条件

时间:2013-07-02 08:33:43

标签: matlab function if-statement inline anonymous-function

函数可以定义为@(x) x^.2(例如)

但是在某种情况下,我们有一个函数可以在不同的时间间隔上进行不同的表示,例如:if abs(x)<3 fun = x^.2 else 0

我们如何使用相同的方式(我的意思是使用@(x))来定义这样的函数。

4 个答案:

答案 0 :(得分:17)

有几种方法可以做到这一点。

乘以假:

g = @(x) (abs(x)<3) .* x.^2

或定义一个合适的功能(真正的最佳方式):

function y = g(x)

    y = zeros(size(x), class(x));

    inds = abs(x)<3;
    y(inds) = x(inds).^2;

end 

或做一些乱七八糟的低效但又有趣的事情并使用inline-if

iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}();
g = @(x) iff( ...
    abs(x)<3,  x.^2, ...
        true,  0);

答案 1 :(得分:0)

正如@Gunther在上面的评论中提到的,一个处理简单条件以模仿第三级运算符的通用函数?:可以创建环绕Matlab不允许在函数内部条件的限制(如果你不&# 39;计算那个混乱,效率低但有趣的内联版本:)。

解决方案是通过这个链接呈现的(也许还有其他几个地方,但SO在我的谷歌搜索中回来了,所以认为它可以在这里添加)。 http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054

定义一个函数,如 iff ifelse ,并将其添加到Matlab路径。

function result = ifelse(condition,trueResult,falseResult)
    error(nargchk(3,3,nargin));  % check correct number of input args
    if condition
        result = trueResult;
    else
        result = falseResult;
    end

然后像这样使用

predict = arrayfun(@(x) ifelse(x>=0.5,1,0), inputData);

在OP的情况下,可以使用类似的东西

arrayfun(@(x) ifelse(abs(x)<3,x^.2,0), data)

答案 2 :(得分:0)

这就是我想出的。我有cases.m函数,其定义如下:

function [ val ] = cases( table )
  [rows,~] = size(table);
  for i = drange(1:rows)
    condition = table{i,1};
    if (ischar(condition) && strcmpi(condition,'else')) || feval(condition)
      val = feval(table{rows,2});
      return
    end
  end
  val={};
end

函数cases采用具有两列的单元格数组。每个元素都是一个零参数的函数。对于每一行,它采用第一个元素,如果是字符串'else'或返回true值的函数,则调用第二个元素并返回其值。如果没有行符合条件,则返回空单元格。元素是nullary函数而不是值,因此不会评估不需要的情况。

然后我可以编写像这样的案例表达式:

w=arrayfun(@(j) cases({ ...
   @() (j==0 || j==n) @() (-1)^j/2; ...
   'else' @() (-1)^j }), 0:n);

这将生成一个数组,其值为0到n,第一个和最后一个值减半。

答案 3 :(得分:0)

要扩展隐藏在@ RodyOldenhuis的答案中的链接,请查看Functional Programming Constructs。该软件包提供了一套非常全面的功能结构。作者还做了一系列guest posts on the Art of MATLAB blog,展示了这个库背后的许多细节。如果您不想将整个软件包放入您的项目中,那么博客帖子中还包含了软件包中某些功能的匿名单行。