Reducing repeated elements in an array by a factor

3 views (last 30 days)
Is there a way to reduce the number of repeated elements in an array by a factor? For example, say the factor I had was 3, i would want to reduce
[1 2 2 2 2 2 2 5 6]
to
[1 2 2 5 6]
i.e. only leave one third of the repeated elements.
Not sure if this is possible but worth a shot, thanks! :)
  4 Comments
Matt J
Matt J on 12 Feb 2020
Edited: Matt J on 12 Feb 2020
Do the repeated elements always occur in fixed, known multiples? How would, a reduction by 3 handle this,
[1 1 1 5 2 2 2 2 6]
Thomas Gvero
Thomas Gvero on 12 Feb 2020
As far as I'm aware, in the context i am using it, yes.

Sign in to comment.

Accepted Answer

Stephen23
Stephen23 on 12 Feb 2020
Edited: Stephen23 on 12 Feb 2020
>> V = [1,2,2,2,2,2,2,5,6];
>> N = 3;
>> X = cumsum([1,diff(V)~=0]);
>> F = @(v) {v(1:ceil(numel(v)/N))};
>> cell2mat(accumarray(X(:),V(:),[],F))
ans =
1
2
2
5
6

More Answers (1)

Matt J
Matt J on 12 Feb 2020
Another method, one which avoids for-loops inherent in cell2mat,
V=[1,2,2,2,0,2,2,2,5,5,5,5,5,5,6,6,6];
N=3;
X = cumsum([1,diff(V)~=0]);
[~,idx]=unique([X,inf],'stable');
result=V( repelem(idx(1:end-1), ceil(diff(idx)/N) ) )
result =
1 2 0 2 5 5 6

Categories

Find more on Data Type Conversion 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!