# Rearrange randomly just some parts of an array

1 view (last 30 days)
luca on 3 Oct 2019
Commented: Andrei Bobrov on 8 Oct 2019
Given
C = [1 2 1 2 1 2 1 2 4 2 4 2 4 2 4 2 6 2 6 2 6 7 6 7 6 7 6 7 7 7 7 7 8 8 8 8 9 9 9 9 ]
I want to rearrange randomly just some subset of the array C where I have maximum two diversity of elements. It means for example that I want to mix 1 and 2 till I meet 4.
Let's see an image in order to well understand what I want to do A subset ends when a third diversity is met
Then in each subset I want to ranperm the value in order to rearrange randomly the elements inside,
obtaining for example
R = [1 1 2 2 1 1 2 2 4 4 2 2 4 2 4 2 2 6 6 2 6 7 7 6 7 7 6 7 7 6 7 7 8 8 9 9 8 9 9 8 ]
May someone help me?

Andrei Bobrov on 3 Oct 2019
Edited: Andrei Bobrov on 3 Oct 2019
C = [1 2 1 2 1 2 1 2 4 2 4 2 4 2 4 2 6 2 6 2 6 7 6 7 6 7 6 7 7 7 7 7 8 8 8 8 9 9 9 9 ];
CC = [C(:);max(C(:))+1];
j = 1;
for i = 2:numel(CC)
if numel(unique(CC(j:i))) > 2
P = CC(j:i-1);
CC(j:i-1) = P(randperm(i-j));
j = i;
end
end
R = CC(1:end-1);
Andrei Bobrov on 8 Oct 2019
Yes.

John D'Errico on 3 Oct 2019
I fail to see the problem, although you are the only one who knows the rules that created this vector, so you will know what to search for.
You just use a while loop.
1. Whatever the first element is, (here, it is a 1.) Locate the first element that is not a 1. That will be the number 2.
2. Now, locate the first element that is not a 1 or 2. Then permute everything between elements 1 and the element that precedes the 4.
Iterate the above steps until the vector is fully permuted.
However, there will be no simply vectorized solution that will magically do what you want. It is just a question of writing the brute force code. As I said, a sequence of finds inside a while loop. Once you find the bounds on the current set of elements, then you do a permutation.
luca on 3 Oct 2019
Sorry John, probably I'm a begginer and for me it's difficult to understand what you mean. But if I'm able to find each subset then I will use the command
S = v(randperm(numel(v))); % where v is the generic subset
for each subset and fill a new vector F with each subset rearrange.
That was my idea, but I don't know how to implement it.
Probably the while loop is a better idea, but I have no idea of how to implement it

R2019b

### Community Treasure Hunt

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

Start Hunting!