Substituting a number for NaN in anonymous function

조회 수: 12(최근 30일)
John 2015년 1월 12일
댓글: Guillaume 2015년 1월 13일
I'm trying unsuccessfully to substitute a number for NaN in anonymous function. Here it's an example of the problem. Bear with it's silliness please:
clc;
clear all;
f=@(x) x*1/x;
g=@(x) (~isnan(f(x))).*f(x) + (isnan(f(x))).*1;
I'd expect that g(0)=1, but it's still NaN. What is wrong in the way that I defined g?
댓글 수: 2표시숨기기 이전 댓글 수: 1
Guillaume 2015년 1월 13일
It's getting a bit messy. You should have accepted the answer that helped you the most and started a new question. Don't pile questions on top of questions, because now there's no appropriate place to answer your new question.
Anyway, the reason why it does not work in the second case is that isnan(fval) == 1 (which is just the same as isnan(fval)) is a logical vector equal to
1 0 0 0 0 0 0 0 0 0 0
If you pass a vector to if it will only evaluate to true if and only if all elements are not zeros. Therefore your expression is false.
To fix this:
if any(isnan(fval))
out = 1;
else
out = fval;
end
Or if you just want to replace the Nans by 1:
fval(isnan(fval)) = 1; %no need for if

댓글을 달려면 로그인하십시오.

채택된 답변

Alfonso Nieto-Castanon 2015년 1월 13일
편집: Alfonso Nieto-Castanon 2015년 1월 13일
There may be "cleaner" ways to do this but one possibility would be:
g = @(x) [f(x) 1]*sparse(1+isnan(f(x)),1,1,2,1);
EDIT: and as others have pointed out the problem with your original g function is that, when f(x) is NaN, you get 0*NaN + 1*1 which still evaluates to NaN...

댓글을 달려면 로그인하십시오.

추가 답변(2개)

John Petersen 2015년 1월 13일
You have .*f(x) in g(x), which is still giving you a NaN
댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Star Strider 2015년 1월 13일
If you want to define L’Hospital’s rule, you have to define it specifically. In the IEEE standard that MATLAB implements, 0/0 is NaN.
See if this works in your application:
n = @(x) 2.*x; % Numerator Function
d = @(x) x; % Denominator Function
Lh = @(n,d,x) (n(x+1E-12)-n(x)) ./ (d((x+1E-12)-d(x))); % L’Hospital’s RUle
Lh0 = Lh(n,d,0) % Evaluating AT 0
Lh2 = Lh(n,d,2) % Evalutaing At 2

댓글을 달려면 로그인하십시오.

범주

Find more on NaNs in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by