MATLAB中NaN是怎么产生的,又如何具体的去解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中NaN是怎么产生的,又如何具体的去解决?相关的知识,希望对你有一定的参考价值。

我给x_o = randn(1,50);进行赋值,运行之后发现,randn(1,50)产生的数据是一堆随机数,但是当我打开x_o时,发现x_o里的数据全变成了NaN,请问这是什么原因造成的?

有很多运算会产生nan,0*Inf,Inf - Inf,Inf/Inf,0/0以及所谓任意数除以0的情况,调试的时候观察是否有这些情况产生。再次强调一下调试很重要,nan不可能是在你截图的这句产生的,请一步一步调试看看是哪一步产生的nan,然后分析为什么产生nan。 参考技术A 可能是出现了除零的操作追问

我并没有进行除法操作,只是生成了一个随机矩阵而已

追答

那肯定是在赋值之后你还对x_o作了其他的操作才有可能这样,不信可以在赋值之后输出x_o看一下

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

【中文标题】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中NaN是怎么产生的,又如何具体的去解决?的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎么计算出来的数很多都是NaN的值呢?怎么回事啊

matlab怎么计算出来的数很多都是NaN的值呢?怎么回事啊

关于matlab中nan读取的问题

怎么去解多元一次方程组快

MATLAB中出现NAN怎么回事

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