假设我定义了一个函数f(x)
,当它非常大时,比如x>100
,它会给出nan
。幸运的是,当为x>100
时,我可以用另一个函数g
替换f
。所以我想定义一下:
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
并使用integral来完成它。
发布于 2018-08-03 08:14:54
您需要创建一个常规函数,并将其与匿名函数包装在一起。
即
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
发布于 2018-08-03 20:01:37
有一个不需要任何附加功能的解决方案:
f = @(x)x.*1./x;
g = @(x)100+x;
h= @(x)getfield(struct('a',f(x),'b',g(x)),char(isnan(f(x))+'a'))
https://stackoverflow.com/questions/51660881
复制相似问题