2010-10-04 68 views

回答

5

啊哈,我知道了:

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

產率x爲0 < 1和NaN的對於x> = 1。

2

下面是不會冒險扔任何除以零的警告的解決方案,因爲它不涉及任何部門(只是功能ONESNAN):

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); 
+1

整齊,但它向量輸入失敗。 – Jonas 2010-10-04 16:14:22

+0

@Jonas:沒錯,雖然從問題中看不出是否需要矢量化解決方案。我會更新我的答案。 – gnovice 2010-10-04 16:16:49

+2

但是當然,任何Matlab函數都應該可以在數組上運行:) – Jonas 2010-10-04 16:18:02

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 
+1

不需要'find'。我最喜歡這個函數,因爲它是最乾淨的實現,它也適用於數組。 – Jonas 2010-10-04 16:12:16

+0

這是真的,謝謝喬納斯 – Amro 2010-10-04 16:17:29

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 

更新:一個同事向我指出的是傑森的原來的答覆只是正常的陣列。

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

f = 

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

>> f(0:.3:2) 

ans = 

    0  0  0  0 NaN NaN NaN 
+0

很高興知道MATLAB的新版本默認不再拋出DBZ警告。這總是有點煩人。 – gnovice 2010-10-04 16:36:18