Reputation: 87
I would appreciate if someone showed me an easy way to do this. Let's say I have a vector in MATLAB like
d = [3 2 4 2 2 2 3 5 1 1 2 1 2 2 2 2 2 9 2]
I want to find the series of consecutive number "twos" and the lengths of those series.
Number twos can easily be found by x=find(d==2)
. But what I want is to get a vector which contains the lengths of all series of consecutive number twos, which means that my result in this case would be a vector like this:
[1 3 1 5 1].
Anyone who could help me?
Upvotes: 6
Views: 11585
Reputation: 880
What if we want the indices of the original matrix where the consecutive values are located? Further, what if we want a matrix of the same size as the original matrix, where the number of consecutive values are stored in the indices of the consecutive values? For example:
original_matrix = [1 1 1;2 2 3; 1 2 3];
output_matrix = [3 3 3;2 2 0;0 0 0];
This problem has relevance for meteorological data quality control. For example, if I have a matrix of temperature data from a number of sensors, and I want to know what days had constant consecutive values, and how many days were constant, so I can then flag the data as possibly faulty.
temperature matrix is number of days x number of stations and I want an output matrix that is also number of days x number of stations, where the consecutive values are flagged as described above.
Upvotes: -1
Reputation: 2131
This seems to work:
q = diff([0 d 0] == 2);
v = find(q == -1) - find(q == 1);
gives
v =
1 3 1 5 1
for me
Upvotes: 9
Reputation: 22588
This is called run length encoding. There is a good m-file available for it at http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencoding . This method is generally faster than the previously posted diff/find way.
tic
d_rle = rle(d==2);
d_rle{2}(d_rle{1}==1);
toc
Elapsed time is 0.002632 seconds.
tic
q = [0 diff([0 d 0] == 2)];
find(q == -1) - find(q == 1);
toc
Elapsed time is 0.003061 seconds.
Upvotes: 6