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的值呢?怎么回事啊