Rearrange randomly just some parts of an array

3 visualizaciones (últimos 30 días)
luca
luca el 3 de Oct. de 2019
Comentada: Andrei Bobrov el 8 de Oct. de 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?

Respuesta aceptada

Andrei Bobrov
Andrei Bobrov el 3 de Oct. de 2019
Editada: Andrei Bobrov el 3 de Oct. de 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);
  4 comentarios
luca
luca el 7 de Oct. de 2019
Hi Andrei I have to ask you an important thing, in your code the number of diversity remain the same? I mean, if in the initial array C I have 2 repeated ten times, then also in R we will find 2 ten times?
please let me know
thanks

Iniciar sesión para comentar.

Más respuestas (1)

John D'Errico
John D'Errico el 3 de Oct. de 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.
  1 comentario
luca
luca el 3 de Oct. de 2019
Editada: luca el 3 de Oct. de 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

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by