在匿名函数内联中将NaN设置为零

fla*_*awr 6 matlab vectorization anonymous-function

我使用匿名函数实现了一个分段函数,该函数也可以在向量或矩阵中进行求值:

 f = @(x) exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75);
Run Code Online (Sandbox Code Playgroud)

问题是在准确评估时,0.25或者0.75我们试图评估Inf * 0哪些结果NaN.我想将这些NaN值设置为零.我知道这可以使用文件中定义的函数轻松完成,但我想知道是否有一个解决方案可以让你进行内联.(可能定义其他匿名帮助函数.)

Lui*_*ndo 6

为了摆脱它们NaN,你可以利用像maxignore 这样的函数NaN:

>> max(NaN, 0)
ans =
     0
Run Code Online (Sandbox Code Playgroud)

它也适用于矢量化:

>> max([1 2 NaN 4], 0)
ans =
     1     2     0     4
Run Code Online (Sandbox Code Playgroud)

您正在使用的数学函数是非负数.因此,如果y是由您的问题中定义的匿名函数生成的数组,max(y, NaN)将保留y未触及的数字条目,并将转换NaN0.

总之,修改匿名函数以包含外部max(..., 0):

f = @(x) max(exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75), 0);
Run Code Online (Sandbox Code Playgroud)

例如,这给出了

>> f([.2 .25 .4 .5 .6 .75 .8])
ans =
   1.0e-06 *
         0         0    0.0053    0.1125    0.0053         0         0
Run Code Online (Sandbox Code Playgroud)

  • 这是*很多*更短,因此更优雅,谢谢! (2认同)