Spit an array when the value 0 occurs until the value 2

I have an array time (6700x1) containing all numbers from -8 to 5 in ascending order.
I would like to have a new array (time_new) based on this that contains all value between 0 and 2.
I know that I can just open the array and look at which position the value 0 occurs and at wich index the value 2 and based on this do time(3981:4962). But since I'm dealing with several arrays where the position of these 2 numbers is not always the same I would like to have something more roboust that I can always use without every time open the array and look for the teo index.
Can someone help to with that?
Thanks in advance

1 Comment

Why do you think finding the position and using the index is not a robust method?
Use logical indexing then. (as @Voss has answered)

Sign in to comment.

 Accepted Answer

% an array time (6700x1) containing numbers from
% -8 to 5 in ascending order:
time = linspace(-8,5,6700).'
time = 6700×1
-8.0000 -7.9981 -7.9961 -7.9942 -7.9922 -7.9903 -7.9884 -7.9864 -7.9845 -7.9825
% time_new based on this that contains
% all value between 0 and 2:
time_new = time(time >= 0 & time <= 2) % use >, < if you want to exclude 0, 2
time_new = 1031×1
0.0010 0.0030 0.0049 0.0069 0.0088 0.0107 0.0127 0.0146 0.0166 0.0185

4 Comments

Thanks Voss, this was exactly what I was looking for ;)
What about if I would like to have an array based on this new one with exacty 102 elements equally spaced?
Like a linspace of the time_new vector
time = linspace(-8,5,6700).';
time_new = time(time >= 0 & time <= 2);
Like this?
time_new_new = linspace(time_new(1),time_new(end),102).'
time_new_new = 102×1
0.0010 0.0208 0.0406 0.0604 0.0802 0.1000 0.1198 0.1396 0.1594 0.1792

Sign in to comment.

More Answers (1)

Your request is a bit ambiguous, so I will give two possibilities.
loc0 = find(YourArray == 0, 'first');
%use this
loc2F = find(YourArray == 2, 'first');
subsetF = YourArray(loc0:loc2F-1);
%OR use this
loc2L = find(YourArray == 2, 'last');
subsetL = YourArray(loc0:loc2L);
Now subsetF includes from the first 0 to the last value before the 2. subsetL includes from the first 0 to the last 2. You do not need both of these; I am just not clear which one you want.
Note that this code is not designed to work if there are no 0 or there are no 2.

3 Comments

Also,
look_for = 0:1; %or 0:2
subset = YourArray(ismember(YourArray, look_for));
This version looks for exact matches against what is in look_for, but does not depend upon the array being sorted and does not depend upon any particular value being present.
Thanks for the answer.
I have this error.
Error using find
Second argument must be a positive scalar integer.
loc0 = find(YourArray == 0, 1, 'first');
%use this
loc2F = find(YourArray == 2, 1, 'first');
subsetF = YourArray(loc0:loc2F-1);
%OR use this
loc2L = find(YourArray == 2, 1, 'last');
subsetL = YourArray(loc0:loc2L);

Sign in to comment.

Products

Release

R2022a

Tags

Community Treasure Hunt

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

Start Hunting!