How can I create a random array like the example C?

A=[1 1 2 2 7 7 9 9]
B=[3 5 6 8 10 11] : randomly choose all items from B and input between 2 same number of A
for example : C=[1 8 6 1 2 5 3 2 7 11 7 9 10 9]

4 comentarios

KALYAN ACHARJYA
KALYAN ACHARJYA el 25 de Abr. de 2019
Editada: KALYAN ACHARJYA el 25 de Abr. de 2019
Hello Hang, this is not random array, its have certain pattern. I have tried in your v1,v2 question, still not getting the exact results as per requirement.
Hang Vu
Hang Vu el 25 de Abr. de 2019
Thank you for the response! I am coding with genetic algorithm, so I am trying to make the chromosome by that way. I don't know if it is possiple. Because for 1 set of sequence, I may have 3 or 4 of "v". So I decided to combine all v into C.
Jan
Jan el 25 de Abr. de 2019
Please mention the details: Does the result need to have at least one value of B between the equal elements of A? Does the order of elements of B matter? Does A have an even number of elements in every case so the new elements can be inserted at the indices 2, 4, 6, ...? Providing 1 example does not define the problem completely.
Hang Vu
Hang Vu el 26 de Abr. de 2019
Thank you Jan! yes at least one value of B between 2 same number of A, and the B'order is no matter. And A is has 2 same number for each elements so it's even number of elements.

Iniciar sesión para comentar.

 Respuesta aceptada

Stephen23
Stephen23 el 26 de Abr. de 2019
Editada: Stephen23 el 26 de Abr. de 2019
A = [1,1,2,2,7,7,9,9];
B = [3,5,6,8,10,11];
Na = numel(A);
Nb = numel(B);
Xb = randperm(Nb) % to shuffle the order of B.
Xa = randperm(Nb-1,Na/2-1);
Xa = diff([0,sort(Xa),Nb]) % the number of elements of B to pick.
T = [num2cell(A(1:2:Na));mat2cell(B(Xb),1,Xa);num2cell(A(2:2:Na))];
C = [T{:}]
Giving (for example):
Xb =
4 6 3 2 1 5
Xa =
1 2 2 1
C =
1 8 1 2 11 6 2 7 5 3 7 9 10 9

6 comentarios

it is so cool! Thank you so much.
But I quite don't understand the Xa = diff([0,sort(Xa),Nb]).
I just tested some cases like if A has more elements and B has less elements by changing D then it doesn't work for all cases. I am sorry by misunderstanding but I just realized we can allow 0 element between A, if don't have enough B to fill in
D = [170, 80, -30, 50, -50, 30, 20, -60, 100, 60 -20];
Iplus=find(D>0);
A=repelem(Iplus,2);
Iminus=find(D<0);
Na = numel(A);
Nb = numel(Iminus);
Xb = randperm(Nb) % to shuffle the order of B.
Xa = randperm(Nb-1,Na/2-1);
Xa = diff([0,sort(Xa),Nb]) % the number of elements of B to pick.
T = [num2cell(A(1:2:Na));mat2cell(B(Xb),1,Xa);num2cell(A(2:2:Na))];
C = [T{:}]
Stephen23
Stephen23 el 26 de Abr. de 2019
Editada: Stephen23 el 26 de Abr. de 2019
"But I quite don't understand the Xa = diff([0,sort(Xa),Nb])."
The concatenation operation [] generates a vector of indices of the ends of blocks of elements, where each block has a random length. The diff then gets those block lengths, which can be used with mat2cell. Because randperm's outputs do not repeat, this guarantees that each block contains at least one element (exactly as you requested).
"I am sorry by misunderstanding but I just realized we can allow 0 element between A"
You wrote that "at least one value of B between 2 same number of A", so that is exactly what my answer does. If you want to change the specification then clearly the code will need to be changed, e.g.:
A = [1,1,2,2,7,7,9,9];
B = [3,5];
Na = numel(A);
Nb = numel(B);
Xb = randperm(Nb) % to shuffle the order of B.
if Nb<=Na/2 % "if don't have enough B to fill in"
Xa = zeros(1,Na/2);
Xa(randperm(Na/2,Nb)) = 1; % the number of elements of B to pick.
else
Xa = randperm(Nb-1,Na/2-1);
Xa = diff([0,sort(Xa),Nb]) % the number of elements of B to pick.
end
T = [num2cell(A(1:2:Na));mat2cell(B(Xb),1,Xa);num2cell(A(2:2:Na))];
C = [T{:}]
Giving (for example):
Xb =
1 2
Xa =
0 1 1 0
C =
1 1 2 3 2 7 5 7 9 9
Thank you for response! I tried to change D, but seem it doesn't work well
D = [170, 80, 30, 80, 50, 30, 20, -60, 100, -60 -20];
Iplus=find(D>0);
A=repelem(Iplus,2);
Iminus=find(D<0);
Na = numel(A);
Nb = numel(Iminus);
Xb = randperm(Nb) % to shuffle the order of B.
if Nb<=Na/2 % "if don't have enough B to fill in"
Xa = zeros(1,Na/2);
Xa(randperm(Na/2,Nb)) = 1; % the number of elements of B to pick.
else
Xa = randperm(Nb-1,Na/2-1);
Xa = diff([0,sort(Xa),Nb]) % the number of elements of B to pick.
end
T = [num2cell(A(1:2:Na));mat2cell(B(Xb),1,Xa);num2cell(A(2:2:Na))];
C = [T{:}]
but the result:
Xb =
1 2 3
Index exceeds the number of array elements (2).
Error in test26_4 (line 18)
T = [num2cell(A(1:2:Na));mat2cell(B(Xb),1,Xa);num2cell(A(2:2:Na))];
Stephen23
Stephen23 el 26 de Abr. de 2019
Editada: Stephen23 el 26 de Abr. de 2019
"I tried to change D, but seem it doesn't work well..:"
I have no idea what D is or how it relates to your question or my answer.
You wrote your question specifying two input vectors A and B. If you show an example with those two vectors (and explain what you expect and what you get) then I can help you further.
Hang Vu
Hang Vu el 26 de Abr. de 2019
Editada: Hang Vu el 29 de Abr. de 2019
I just realized I didn't change B to Iminus. Now it works well. Thank you so much!^^
Could you please help me more on this! for all cases, can be either pick 1 1 or 2 numbers!
Xb =
1 2
Xa =
0 1 1 0 => 0 0 2 0
C =
1 1 2 3 2 7 5 7 9 9 => 1 1 2 2 7 3 5 7 9 9
if Nb<=Na/2 % "if don't have enough B to fill in"
Xa = zeros(1,Na/2);
Xa(randperm(Na/2,Nb)) = 1; % the number of elements of B to pick.
else
Xa = randperm(Nb-1,Na/2-1);
Xa = diff([0,sort(Xa),Nb]) % the number of elements of B to pick.
end
and it's possible to have 0 for all cases, not only Nb<=Na

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 25 de Abr. de 2019

Comentada:

el 29 de Abr. de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by