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

6 次查看(过去 30 天)
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!

采纳的回答

Sean de Wolski
Sean de Wolski 2015-3-17
编辑:Sean de Wolski 2015-3-17
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))

更多回答(1 个)

Guillaume
Guillaume 2015-3-17
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)

类别

Help CenterFile Exchange 中查找有关 Argument Definitions 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by