假设我定义了一个函数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
并使用积分来实现。
答案 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'))