Effacer les filtres
Effacer les filtres

Splitting a vector into 'on' periods

1 vue (au cours des 30 derniers jours)
CarrotCakeIsYum
CarrotCakeIsYum le 24 Sep 2015
Commenté : Star Strider le 28 Sep 2015
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!

Réponse acceptée

Star Strider
Star Strider le 24 Sep 2015
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
  2 commentaires
CarrotCakeIsYum
CarrotCakeIsYum le 28 Sep 2015
Thank you! This was a great help.
Star Strider
Star Strider le 28 Sep 2015
My pleasure!

Connectez-vous pour commenter.

Plus de réponses (4)

Thorsten
Thorsten le 24 Sep 2015
Modifié(e) : Thorsten le 24 Sep 2015
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 le 24 Sep 2015
Modifié(e) : Stephen23 le 24 Sep 2015
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) le 24 Sep 2015
% 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 le 28 Sep 2015
Thanks everyone - the advice was brilliant and all is working perfectly.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by