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

6 vues (au cours des 30 derniers jours)
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!

Réponse acceptée

Sean de Wolski
Sean de Wolski le 17 Mar 2015
Modifié(e) : Sean de Wolski le 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 commentaires
Matthew
Matthew le 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

Connectez-vous pour commenter.

Plus de réponses (1)

Guillaume
Guillaume le 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)

Catégories

En savoir plus sur Argument Definitions 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