Try to mix as much as possible elements inside an array

3 views (last 30 days)
Given a vector
V = [1 1 1 1 1 1 1 4 4 4 4 4 1 1 1 1 1 4 4 4 4 4 4 5 5 5 5 5 5 8 8 8 8 8 8 5 5 5 5 5 5 5 5 6 6 6 6 6 6 8 8 8 8 5 5 5 5 6 6 7 7 7 7 7 9 9 9 9 9 7 7 7]
I would like to destroy the consecutivity of the same number and mix the elements. In particular I want to mix 1 just with 4, 5 just with 6-8 and 7 just with 9.
obtaining for example:
S = [1 1 4 1 4 1 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 4 5 5 8 5 8 5 8 5 8 5 8 6 5 5 6 5 5 5 8 5 6 8 6 5 6 5 8 6 5 8 5 6 5 5 8 6 7 9 7 7 7 9 7 9 7 9 7 9 7]
It's not important the way I mix but it's important the consecutivity: first 1-4 then 5-8-6 and finally 7-9
May someone help me to find a way to obtain S?
  3 Comments
Aquatris
Aquatris on 17 Sep 2019
Edited: Adam Danz on 23 Sep 2019
Check the function randperm(). Then you can create an index vector and shuffle the elements to obtain what you want.
luca
luca on 18 Sep 2019
Edited: luca on 18 Sep 2019
I've changed the structure in order to avoid this problem, but I'm still interested in knowing if there is a solution for that
Thanks

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 18 Sep 2019
The 'exchangeOpts' is a list of exchange options such that any value in V that matches a value in exchangeOpts{n} can be replaced with a random value from exchangeOpts{n}.
V = [1 1 1 1 1 1 1 4 4 4 4 4 1 1 1 1 1 4 4 4 4 4 4 5 5 5 5 5 5 8 8 8 8 8 8 5 5 5 5 5 5 5 5 6 6 6 6 6 6 8 8 8 8 5 5 5 5 6 6 7 7 7 7 7 9 9 9 9 9 7 7 7];
exchangeOpts = {[1,4],[5,6],[7,9]}; %identify exchange groups (in cell array to allow for mixed vector sizes)
% loop through each exchange option
S = V;
for i = 1:numel(exchangeOpts)
idx = ismember(V,exchangeOpts{i}); %identifies which elements will be randomized
S(idx) = exchangeOpts{i}(randi(numel(exchangeOpts{i}),1,sum(idx)));
end

More Answers (0)

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!