如何修复匿名函数中的nan?

时间:2018-08-02 19:28:05

标签: matlab nan anonymous-function

假设我定义了一个函数f(x),当它非常大时给出nan,例如x>100。幸运的是,当x>100时,我可以用另一个函数f代替g。所以我想定义:

h = @(x)isnan(f(x)).*f(x)+isnan(f(x)).*g(x)

但是,当我替换h(1001)时,它得到的是nan。是否可以定义h使其给出g(1001)而不是nan?唯一的限制是我需要具有匿名函数h以便以后使用,例如我想在集成中使用它,即integral(h,0,inf)

示例:假设我有一个函数:

f = @(x)x.*1./x

此功能非常简单,必须为1。我构造了一个函数:

g = @(x)isnan(f(x)).*0+isnan(f(x)).*1

如何正确定义g,以便我仍然可以评估integral(g,-1,1)?对于此示例,我知道我可以轻松地对其进行评估,但是我的限制是我需要定义匿名函数g并使用积分来实现。

2 个答案:

答案 0 :(得分:1)

您需要制作一个常规函数,并用匿名函数包装它。

function r = ternary(a, b, c)
  if (a)
    r = b;
  else
    r = c;
  end
end

h = @(x)ternary(isnan(f(x)), g(x), f(x));

请注意,这将对您的功能进行两次评估。针对您的特殊情况的通用性较低的解决方案,不会对函数进行两次评估。

function r = avoidNAN(a, b)
  if (isnan(a))
    r = b;
  else
    r = a;
  end
end

答案 1 :(得分:0)

有一个没有任何其他功能的解决方案:

f = @(x)x.*1./x;
g = @(x)100+x;
h= @(x)getfield(struct('a',f(x),'b',g(x)),char(isnan(f(x))+'a'))