Split array into sub arrays

3 views (last 30 days)
Morgan Roberts
Morgan Roberts on 14 Dec 2017
Edited: KL on 14 Dec 2017
Hi,
I am trying to split some data in x,y,z:
x = [351;333;337;341;346;350;354;359;363;368;372;377];
y = [145;180;182;184;186;188;190;192;194;195;197;198];
z = [31;31;30;28;28;26;24;23;21;20;19;18];
based on the values of another array named data:
data = [0,0,0,2,0,0,1,0,0,0,0,0];
So that when data = 2, the following values of x, y and z are calculated until data = 1. So in this case the data would be split into the following:
When data hits equal to 2:
x = [351;333;337;341];
y = [145;180;182;184];
z = [31;31;30;28];
And then up until data = 1:
x = [346;350;354];
y = [186;188;190];
z = [28;26;24];
and finally the after 1..
x = [359;363;368;372;377];
y = [192;194;195;197;198];
z = [23;21;20;19;18];
However I am really struggling getting this to work, it either extrapolates x, y and z when data is equal to 2 or brings up errors. Any help would be appreciated.
Cheers
  2 Comments
Jos (10584)
Jos (10584) on 14 Dec 2017
What do you want to with the subarrays? Store them, use them for input to a function?
Morgan Roberts
Morgan Roberts on 14 Dec 2017
I want to store them

Sign in to comment.

Accepted Answer

KL
KL on 14 Dec 2017
Edited: KL on 14 Dec 2017
Or use mat2cell,
res = mat2cell([x y z].',3,diff([0 find(data) numel(data)]))
you get the result in a cell array, each cell containing the data split you want
>> res{1}
351 333 337 341
145 180 182 184
31 31 30 28
>> res{2}
346 350 354
186 188 190
28 26 24
>> res{3}
359 363 368 372 377
192 194 195 197 198
23 21 20 19 18

More Answers (1)

Jos (10584)
Jos (10584) on 14 Dec 2017
This splits the x,y, and z values into separate blocks:
x = [351;333;337;341;346;350;354;359;363;368;372;377];
y = [145;180;182;184;186;188;190;192;194;195;197;198];
z = [31;31;30;28;28;26;24;23;21;20;19;18];
data = [0,0,0,2,0,0,1,0,0,0,0,0];
p = cumsum([0 data(1:end-1)]~=0) + 1 ;
c = arrayfun(@(k) struct('x', x(p==k), 'y', y(p==k), 'z', z(p==k)), 1:p(end), 'un', 0) ;
s = cat(1,c{:})
The structure s holds the three blocks of (x,y,z) as specified by data. For instance, s(1).x holds the x values from the beginning up to the first non-zero in data.

Tags

Community Treasure Hunt

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

Start Hunting!