Splitting a vector into 'on' periods

1 次查看(过去 30 天)
Hi,
I'm investigating data from a force plate (study of balance in people with movement disorders). I have a raw signal such as:
vector = 1 2 3 4 0 0 0 0 5 6 7 4 7 8 0 0 0 1 2 5 4 0 0 0 0 0 5 6
I need to split this signal into separate vectors that only contain sequences of numbers greater than 0. So the ideal result for the above would be:
vector 1 = 1 2 3 4
vector 2 = 5 6 7 4 7 8
vector 3 = 1 2 5 4
vector 4 = 5 6
I hope the question is clear enough. Any help would be greatly appreciated!

采纳的回答

Star Strider
Star Strider 2015-9-24
I did my best to make this as robust as possible:
vector = [1 2 3 4 0 0 0 0 5 6 7 4 7 8 0 0 0 1 2 5 4 0 0 0 0 0 5 6];
vec_nz = vector > 0; % Non-Zero Elements
dv = diff([0 vec_nz 0]); % Index Vector
on = find(dv > 0);
off = find(dv < 0);
sections = abs(on-off); % Divide ‘vector’ Here
VectorCell = mat2cell(vector(vec_nz), 1, sections); % Create Cell
VectorCell{:} % Display Results (Can Be Deleted)
ans =
1 2 3 4
ans =
5 6 7 4 7 8
ans =
1 2 5 4
ans =
5 6

更多回答(4 个)

Thorsten
Thorsten 2015-9-24
编辑:Thorsten 2015-9-24
w = [false v~=0 false]; % "close" v with zeros, and transform to logical
starts = find(w(2:end) & ~w(1:end-1)); % find starts of runs of non-zeros
ends = find(~w(2:end) & w(1:end-1))-1; % find ends of runs of non-zeros
result = arrayfun(@(s,e) v(s:e), starts, ends, 'uniformout', false); % build result
You can also use diff to compute starts and ends indices
starts = find(diff(w) == 1);
ends = find((diff(w) == -1)) - 1;

Stephen23
Stephen23 2015-9-24
编辑:Stephen23 2015-9-24
This is fast and simple using accumarray:
V = [1,2,3,4,0,0,0,0,5,6,7,4,7,8,0,0,0,1,2,5,4,0,0,0,0,0,5,6];
X = V>0;
Y = diff([false,X]);
Z = cumsum(Y(X));
out = accumarray(Z(:),V(X),[],@(n){n})

Jos (10584)
Jos (10584) 2015-9-24
% A one-liner, works when vector only contains values as in the example:
vector = [1 2 3 4 0 0 0 0 5 6 7 4 7 8 0 0 0 1 2 5 4 0 0 0 0 0 5 6] ;
OUT = cellfun(@(x) double(x),strsplit(char(vector),char(0)),'un',0) % cellarray

CarrotCakeIsYum
CarrotCakeIsYum 2015-9-28
Thanks everyone - the advice was brilliant and all is working perfectly.

类别

Help CenterFile Exchange 中查找有关 Get Started with MATLAB 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by