在内联

时间:2017-04-29 18:45:01

标签: matlab vectorization anonymous-function

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

 f = @(x) exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75);

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

4 个答案:

答案 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)