Partitioning a Vector
Recently on the MATLAB newsgroup, there was a thread asking how to split up a vector into pieces which were each monotonically increasing by the value 1. The post got several answers which I did not read first. Here's my thinking.
Contents
Sample Data
Here's my sample data.
a=[2,3,4,7,9,12,13,14,15]
a = 2 3 4 7 9 12 13 14 15
Problem and Solution
I want to break this into 4 pieces: the runs 2:4 and 12:15, plus the scalars 7 and 9. Here's how I thought about the problem.
First I want to find the runs, which are elements that differ by 1. So I calculate the differences, making sure I include the final value in the array (which is why I append a 0 below).
ad = [diff(a) == 1 0]
ad = 1 1 0 0 0 1 1 1 0
Next, I figure out how many runs there are, by seeing how many 0 values are represented in the differences. This tells me how many arrays I will split my original array into.
numcells = sum(ad==0) out = cell(1,numcells);
numcells = 4
Next I find the ending indices of the chunks by looking where ad is 0. Then I start to create contents for each cell in the cell array out, starting with index 1 in the original array.
indends = find(ad == 0); ind = 1; for k = 1:numcells out{k} = a(ind:indends(k)); ind = indends(k)+1; end
Here's what out looks like now.
out out{:}
out = [1x3 double] [7] [9] [1x4 double] ans = 2 3 4 ans = 7 ans = 9 ans = 12 13 14 15
File Exchange Function
On the File Exchange, you can get a more general purpose function called SplitVec on SplitVec by Bruno. It does this and a whole lot more.
Do You Need to Partition Data?
If you need to partition data, I'd like to understand why, and how you do so. Let me know here.
- Category:
- Cell Arrays,
- How To,
- Indexing