Using unique.m function on NaNs

조회 수: 9 (최근 30일)
Rahul Chander
Rahul Chander 2011년 5월 17일
Can someone please clarify if the result of unique([1 nan; 1 nan],'rows') should be
a) [1 nan; 1 nan] OR b) [1 nan]
Basically, in my version of matlab (2008b), I get a) as the answer and I think it's a bug as the answer should be b). Can someone please confirm if this is a feature or an issue. My mathworks support is limited because of $$ :(

채택된 답변

Sean de Wolski
Sean de Wolski 2011년 5월 17일
No. It's supposed to be a.
By definition nans are not equal to themselves so they're not equal in rows either.
isequal(nan,nan)
or
nan==nan

추가 답변 (3개)

Jan
Jan 2011년 5월 17일
NaNs compared to anything replies FALSE, even NaN==NaN. This is defined by the IEEE754 conventions.
Therefore [1, NaN] compared to [1, NaN] is FALSE also. In consequence UNIQUE([[1, NaN; 1, NaN], 'rows') must reply two rows.

Matt Fig
Matt Fig 2011년 5월 17일
In addition to what others have said, note this horribly named function:
A = [1 nan; 1 nan];
isequalwithequalnans(A(1,:),A(2,:))
  댓글 수: 5
Sean de Wolski
Sean de Wolski 2011년 5월 17일
nanisequal does too and sticks in line with: nanmean, nanmedian, nancumsum etc.
Matt Fig
Matt Fig 2011년 5월 17일
@Andrew, I think you would agree that there is more to a great function name that it being descriptive! How often do you name your functions, for instance:
performstatisticsonmydatathenplottheresults(A)
I just think it is a monstrosity (IMO) to have a 20 character function name, that's all. Why not, for example, use:
isequal(A,B,'nansequal') % Or similar
or a name like Sean de recommends?

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


Andy
Andy 2011년 5월 17일
If you have some application for which you need to ignore NaNs rather than take them into account, you could replace them with some other value which is easily identifiable as non-data. For example:
A; % your data
A(isnan(A)) = Inf; % replace NaN with Inf
A = unique(A,'rows'); % unique rows, where [1,Inf] == [1,Inf]
A(isinf(A)) = NaN; % convert back to NaN
It's a little hackish. I know there are various toolbox functions, like nanmean and nanstd, which calculate other statistics of a dataset while ignoring NaNs. But there is no nanunique or nansort. Also, the work in unique is done by calling sortrows which calls a MEX file, so you can't just edit it to take NaNs into account. So the above code seems like the cleanest quick solution.
  댓글 수: 4
Rahul Chander
Rahul Chander 2011년 5월 17일
I think i would need to precondition the data to deal with NaNs basically by either removing them or replacing them or interpolating. Thank you all.
Andy
Andy 2011년 5월 17일
@Sean de, Matt Fig is correct. I intended him to replace Inf with any "value which is easily identifiable as non-data". I was just using Inf as an example, since, for my purposes, Inf never comes up data. But Rahul should choose whatever flag value is appropriate for the application.

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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by