Effacer les filtres
Effacer les filtres

How to find last and first column of matrix which is not NaN?

6 vues (au cours des 30 derniers jours)
Kaia
Kaia le 18 Sep 2012
Hi there,
Lets say I have 24 columns with 8760 rows. In some of the first columns (in some cases 1-5 columns are all NaNs) and last columns (for example 21-24) are 8760 NaNs. Is there some quick way to find the number (index) of the first column(s) where are at least some values which are not NaNs (1 not a NaN is also suitable), and the last column where all the rows are not NaN.
Many thanks,
Kaia

Réponses (3)

José-Luis
José-Luis le 18 Sep 2012
Modifié(e) : José-Luis le 18 Sep 2012
Index to first column:
idx_first = find(sum(~isnan(your_data),1) > 0, 1 ,'first')
Index to the last column:
idx_last = find(sum(~isnan(your_data),1) > 0, 1 , 'last')
  2 commentaires
Kaia
Kaia le 18 Sep 2012
I tried it, but i`m getting this error:
Error using find Second argument must be a positive scalar integer.
José-Luis
José-Luis le 18 Sep 2012
My bad, I forgot a 1 in there. See my edited answer.

Connectez-vous pour commenter.


Andrei Bobrov
Andrei Bobrov le 18 Sep 2012
Modifié(e) : Andrei Bobrov le 21 Sep 2012
A - your array with NaN;
t = ~isnan(A);
idx0 = [find(any(~t) & any(t)),find(all(t))];
idx = idx0([1,end]);
  2 commentaires
Andrei Bobrov
Andrei Bobrov le 18 Sep 2012
corrected
Andrei Bobrov
Andrei Bobrov le 21 Sep 2012
corrected 2

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 18 Sep 2012
I think this handles all cases that you might care about:
%-------------------------------------------------
% Generate some sample data.
m = randi(9, [8760,24]);
% Make first 5 columns all NaNs
m(:, 1:5) = nan;
% Make column 7 have mostly NaNs but a few non-Nan values.
m(10:end, 7) = NaN;
% Make last 2 columns all NaNs
m(:, end-1:end) = nan;
%-------------------------------------------------
% Now we have our sample data and we can begin
% Find out where all the NaN's live.
% This is a 2D map of their locations.
nanMap = isnan(m);
% Find out which columns have no NaNs at all.
noNanRows = find(all(~nanMap));
% Find out which columns have all 8760 value = NaN.
allNanRows = find(all(nanMap));
% Find out which columns have NOT all 8760 values = NaN,
% in other words, columns that have at least some values that are not NaNs.
% This is, a mixture of NaN's and valid numerical values.
nansPerColumn = sum(nanMap);
someNanRows = find(nansPerColumn > 0 & nansPerColumn < size(m, 1));

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by