Creating sub arrays from a larger array

9 views (last 30 days)
Arcot on 12 Sep 2022
Edited: Arcot on 12 Sep 2022
I have a large array of size 20000x2 which contains sensor data and of this array. The first column contains datetime and the data on the second column column contains sensor data which is of interest here. The sample time for this sensor is at 0.1sec and I now have sensor data that is uneven. In simple words, the data is recorded whenever there is a movement and the rest of the cells are zero as in the example below.
Example: [0,0,0,....,1,1.5,2,2,2.8,3,3.2,4,5,...,0,0,0,0,....4,4.5,4,5,8,8.3,8.4,9] and the pattern repeats.
I am looking to split this array into segments based on the change in data from 0 to any value to capture the valid data in the format as shown in the picture, if possible.
  1. Get the indexes at which the changes occurs.
  2. Capture the data into segments --> [1,1.5,2,2,2.8,3,3.2,4,5] in the first subarray, [4,4.5,4,5,8,8.3,8.4,9] in the second subarray and so on along with its corresponding value from the first column
Thank you in advance.

Answers (1)

John D'Errico
John D'Errico on 12 Sep 2022
Edited: John D'Errico on 12 Sep 2022
DON'T split them into separate, named arrays. This is just a bad way to write code. It will create buggy, slow code, even if you do make it work.
How SHOULD you do it? Put each block into a separate cell of a cell array. Now they are all still in one place, but each segment is now in its own separate place, easily and efficiently accessed.
How to do that operation? Just use a loop. You don't need anything highly vectorized, one command that will do it for you. Simple, one time operations like this are perfect for loops.
Can you do it using vectorized code? Well, yes. In fact, that is easy enough to do, to locate the indices where a segment starts and stops. The trick is to look for the point where a zero changes into a non-zero. So if the vector is called V, you might do this:
V = [0,0,0,1,1.5,2,2,2.8,3,3.2,4,5,0,0,0,0,4,4.5,4,5,8,8.3,8.4,9];
startlocs = strfind([0,V ~= 0],[0 1])
startlocs = 1×2
4 17
endlocs = strfind([V ~= 0,0],[1,0])
endlocs = 1×2
12 24
  1 Comment
Arcot on 12 Sep 2022
Edited: Arcot on 12 Sep 2022
I will embed this piece and test it out. Thank you.
However, what is the best way to put these segments into different cell arrays? I reckon a loop should do the work, but is there a better way? If yes, how?

Sign in to comment.


Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!