parsing a vector by NaN into separte, unequal vectors into a cell array

6 views (last 30 days)
I'm trying to parse a vector with NaN, into a cell array that is delineated by the start and stop of the NaN
example = [1 2 3 Na Na 2 3 Na 4 5 6 7 Na Na Na Na 1];
and turn that into
answer = {[1 2 3] [2 3] [4 5 6 7] [1]}
any suggestions? I've been using find(isnan(example)) to get the indices of NaN, but what I really need are the stop and stop indices of the non - NaN segments
Thanks!

Accepted Answer

Sean de Wolski
Sean de Wolski on 17 Mar 2015
Edited: Sean de Wolski on 17 Mar 2015
EDIT
Here's a fully vectorized engine that keeps original indices. This requires the Image Processing Toolbox.
x = [1 2 3 nan nan 2 3 nan 4 5 6 7 nan nan nan 1];
notnans = ~isnan(x);
idx = bwlabel(notnans);
n = histcounts(idx);
oneToN = 1:numel(x);
C = mat2cell([x(notnans); oneToN(notnans)],2,n(2:end))
  2 Comments
Matthew
Matthew on 17 Mar 2015
Thanks! Would there be a way to have the original indices in the answer?:
so that:
answer = {[1 2 3;1 2 3] [6 7; 2 3] [9 10 11 12; 4 5 6 7] [16;1];
Thanks for your help

Sign in to comment.

More Answers (1)

Guillaume
Guillaume on 17 Mar 2015
Here is a solution that does not require any toolbox:
x = [1 2 3 nan nan 2 3 nan 4 5 6 7 nan nan nan 1];
transitions = diff([1 isnan(x) 1]);
starts = find(transitions == -1);
lengths = find(transitions == 1) - starts;
nonanx = arrayfun(@(s, l) {[s:s+l-1; x(s:s+l-1)]}, starts, lengths)

Categories

Find more on Argument Definitions 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!