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维度获取size()函数详解