Borrar filtros
Borrar filtros

find length NaN segments

4 visualizaciones (últimos 30 días)
Lieke Numan
Lieke Numan el 21 de Feb. de 2019
Comentada: madhan ravi el 22 de Feb. de 2019
I have large vectors, containing quite a lot of NaN samples. I want to know the length of each array of NaNs within this vector, even when this equals 1. So I want to have the lenght of all NaN segments.
Thanks in advance!
  1 comentario
Stephen23
Stephen23 el 22 de Feb. de 2019
Note to future readers: the accepted answer fails for many simple cases:
Only NaN
>> A = [NaN,NaN,NaN,NaN];
>> index=find(isnan(A));
>> idx=find(diff(index)~=1);
>> R=[idx(1) diff(idx) numel(index)-idx(end)]
Attempted to access idx(1); index out of bounds because numel(idx)=0.
Only Numbers
>> A = [1,2,3,4];
>> index=find(isnan(A));
>> idx=find(diff(index)~=1);
>> R=[idx(1) diff(idx) numel(index)-idx(end)]
Attempted to access idx(1); index out of bounds because numel(idx)=0.
Empty Vector
>> A = [];
>> index=find(isnan(A));
>> idx=find(diff(index)~=1);
>> R=[idx(1) diff(idx) numel(index)-idx(end)]
Attempted to access idx(1); index out of bounds because numel(idx)=0.
Leading Numbers
>> A = [1,NaN,NaN,NaN];
>> index=find(isnan(A));
>> idx=find(diff(index)~=1);
>> R=[idx(1) diff(idx) numel(index)-idx(end)]
Attempted to access idx(1); index out of bounds because numel(idx)=0.
Trailing Numbers
>> A = [NaN,NaN,NaN,1];
>> index=find(isnan(A));
>> idx=find(diff(index)~=1);
>> R=[idx(1) diff(idx) numel(index)-idx(end)]
Attempted to access idx(1); index out of bounds because numel(idx)=0.

Iniciar sesión para comentar.

Respuesta aceptada

madhan ravi
madhan ravi el 21 de Feb. de 2019
Editada: madhan ravi el 21 de Feb. de 2019
  9 comentarios
madhan ravi
madhan ravi el 22 de Feb. de 2019
Turns out not possible :D.
madhan ravi
madhan ravi el 22 de Feb. de 2019
@Lieke there are so many limitations to this answer , you have accepted the wrong answer ;-)

Iniciar sesión para comentar.

Más respuestas (3)

Stephen23
Stephen23 el 21 de Feb. de 2019
Editada: Stephen23 el 22 de Feb. de 2019
This is simpler and actually works for all horizontal vectors (unlike the accepted answer):
>> A = [NaN NaN NaN 1 2 3 4 NaN 3 44 NaN];
>> D = diff([false,isnan(A),false]);
>> find(D<0)-find(D>0)
ans =
3 1 1
For a slightly faster version you can call find once:
>> F = find(diff([false,isnan(A),false]));
>> F(2:2:end)-F(1:2:end)
ans =
3 1 1
EDIT: uses Jan's logical vector suggestion.
  8 comentarios
madhan ravi
madhan ravi el 22 de Feb. de 2019
Yes but in this thread :D.
Stephen23
Stephen23 el 22 de Feb. de 2019
"Yes but in this thread "
The main difference is swapping == for isnan (which everyone used). I doubt that it makes much difference, but you are welcome to do some tests and post the results here.

Iniciar sesión para comentar.


Jan
Jan el 22 de Feb. de 2019
Editada: Jan el 22 de Feb. de 2019
And again: With FEX: RunLength :
[B, N] = RunLength(A);
Result = N(isnan(B));
Or:
y = [false, isnan(A), false];
Result = strfind(y, [true, false]) - strfind(y, [false,true])
For this test vector:
A = ones(1, 1e5);
A(randperm(1e5, 5e4)) = NaN;
the method posted by Jos (link) is about 10% faster:
D = diff(find(diff([false, isnan(A), false])));
R = D(1:2:end);

KSSV
KSSV el 21 de Feb. de 2019
Read about isnan and nnz
  4 comentarios
madhan ravi
madhan ravi el 21 de Feb. de 2019
Editada: madhan ravi el 21 de Feb. de 2019
OP wants it like 3 nans and 1 nan not the total number of nans or the length of each numbers inbetween nans.
KSSV
KSSV el 21 de Feb. de 2019
he can use diff anddo that..

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by