我使用匿名函数实现了分段函数,该函数也可以在向量或矩阵中进行求值:
f = @(x) exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75);
问题是,在完全0.25
或0.75
进行评估时,我们会尝试评估Inf * 0
,结果为NaN
。我想将这些NaN
值设置为零。我知道这可以使用文件中定义的函数轻松完成,但我想知道是否有一个解决方案可以让你进行内联。 (可能定义其他匿名帮助函数。)
答案 0 :(得分:5)
要摆脱NaN
,您可以利用max
等某些功能忽略NaN
的事实:
>> max(NaN, 0)
ans =
0
也可以进行矢量化:
>> max([1 2 NaN 4], 0)
ans =
1 2 0 4
您正在使用的数学函数是非负数。因此,如果y
是由您的问题中定义的匿名函数生成的数组,max(y, NaN)
将保留y
的数字条目不变,并将NaN
转换为{{1} }}
总之,将匿名函数修改为包含外部0
:
max(..., 0)
例如,这提供了
f = @(x) max(exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75), 0);
答案 1 :(得分:2)
这个怎么样:
g = @(x) sum(cat(length(size(x))+1,x-1,~isnan(x)),length(size(x))+1,'omitnan');
x=1./(rand(100)>0.5);x=x.*0;x=x+10; %demo data with nan and 10
y=g(x); %now it has 0 and 10;
诀窍是使用“与omitnan”相加的总和。它将每个非纳米值加1,每纳米加0。它在求和中省略了nan,因此每个nan变为0.通过从每个值中预先减去1,它返回原始值。
ofcourse
x(isnan(x))=0;
也有效,但不是匿名函数。
答案 2 :(得分:0)
所以assumig x
是一个列向量,后面的解决方案可行,但不是很优雅:
deNaNify1 = @(x)x((2:2:end)-isnan(x(2,:)));
deNaNify = @(x)deNaNify1([zeros(size(x'));x'])
答案 3 :(得分:0)
简而言之:对于将NaN设置为零后的实数:
denanify = @(y) min(y,0)-min(-y,0)