matlab:如果 x > 1 则可以产生 NaN 的快速函数

Posted

技术标签:

【中文标题】matlab:如果 x > 1 则可以产生 NaN 的快速函数【英文标题】:matlab: quick function that can produce NaN if x > 1 【发布时间】:2011-04-20 19:50:39 【问题描述】:

我正在寻找一个单行函数f = @(x) something,如果 x >= 1 会产生 NaN,如果 x

有什么建议吗?

【问题讨论】:

【参考方案1】:

这是对 Jason 解决方案的修改,适用于数组。请注意,最新版本的 MATLAB 不会引发除零警告。

>> f = @(x) zeros(size(x)) ./ (x < 1)

f = 

    @(x)zeros(size(x))./(x<1)

>> f(0:.3:2)

ans =

     0     0     0     0   NaN   NaN   NaN

更新:一位同事向我指出,Jason 的原始答案适用于数组。

>> f = @(x) 0./(x<1)

f = 

    @(x)0./(x<1)

>> f(0:.3:2)

ans =

     0     0     0     0   NaN   NaN   NaN

【讨论】:

很高兴知道较新版本的 MATLAB 默认不再引发 DBZ 警告。这总是有点烦人。【参考方案2】:

这是一个不会引发任何除零警告的解决方案,因为它不涉及任何除法(仅函数 ONES 和 NAN):

f = @(x) [ones(x < 1) nan(x >= 1)];

编辑: 上述解决方案是针对标量输入的。如果需要矢量化解决方案(问题不是 100% 清楚),那么您可以像这样修改 f

f = @(x) arrayfun(@(y) [ones(y < 1) nan(y >= 1)],x);

或者在调用第一版函数f时应用ARRAYFUN:

y = arrayfun(f,x);

【讨论】:

简洁,但矢量输入失败。 @Jonas:是的,尽管从问题中看不出需要矢量化解决方案。我会更新我的答案。 太棒了!现在我可以为最聪明的解决方案 +1。【参考方案3】:

这是一个不太明显的解决方案(不过是矢量化的):

f = @(x) subsasgn(zeros(size(x)), struct('type','()','subs',x>=1), nan) + 0

基本上相当于:

function v = f(x)
    v = zeros(size(x));
    v( x>=1 ) = nan;

最后的+0 始终强制输出,即使在没有输出参数的情况下调用f(在ans 中返回)。示例:

>> f(-2:2)
ans =
     0     0     0   NaN   NaN

【讨论】:

不需要find。我最喜欢这个函数,因为它是最简洁的实现,也适用于数组。【参考方案4】:

啊哈,我明白了:

f = @(x) 0./(x<1)

x =1 为 NaN。

【讨论】:

以上是关于matlab:如果 x > 1 则可以产生 NaN 的快速函数的主要内容,如果未能解决你的问题,请参考以下文章

matlab中方差计算的问题

matlab中怎样求随机数的和、均方差、均值、平方

MATLAB产生离散信号

MATLAB从入门到精通系列之MATLAB维度获取size()函数详解

matlab中后一次循环把前一次循环产生的数组覆盖掉怎么解决

linespace函数