7

我正在寻找一个单行函数f = @(x) {something},如果 x >= 1 则产生 NaN,如果 x < 1 则产生 0 或 1。

有什么建议么?

4

4 回答 4

5

啊哈,我明白了:

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

对于 x < 1 产生 0,对于 x>=1 产生 NaN。

于 2010-10-04T13:50:53.797 回答
5

这是适用于数组的 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
于 2010-10-04T16:23:32.707 回答
2

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

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


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

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

或者在调用函数的第一个版本时应用ARRAYFUNf

y = arrayfun(f,x);
于 2010-10-04T15:28:06.320 回答
2

这是一个不太明显的解决方案(尽管如此矢量化):

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
于 2010-10-04T16:01:05.410 回答