필터 지우기
필터 지우기

How to Permute the array with specific number?

조회 수: 2 (최근 30일)
Hang Vu
Hang Vu 2019년 5월 28일
댓글: Hang Vu 2019년 5월 29일
I want to keep 1,2,6,7,9,10, they will not move
I have this array
b=[1,5,2,8,6,11,7,9,3,10]
P=perms(b);
HOw to use perms for 3,5,8,11 among 6 numbers above?

채택된 답변

Stephen23
Stephen23 2019년 5월 29일
>> b = [1,5,2,8,6,11,7,9,3,10];
>> idx = ~ismember(b,[1,2,6,7,9,10]);
>> mat = repmat(b,factorial(nnz(idx)),1);
>> mat(:,idx) = perms(b(idx))
mat =
1 11 2 8 6 5 7 9 3 10
1 11 2 8 6 3 7 9 5 10
1 11 2 5 6 8 7 9 3 10
1 11 2 5 6 3 7 9 8 10
1 11 2 3 6 8 7 9 5 10
1 11 2 3 6 5 7 9 8 10
1 8 2 11 6 5 7 9 3 10
1 8 2 11 6 3 7 9 5 10
1 8 2 5 6 11 7 9 3 10
1 8 2 5 6 3 7 9 11 10
1 8 2 3 6 11 7 9 5 10
1 8 2 3 6 5 7 9 11 10
1 5 2 11 6 8 7 9 3 10
1 5 2 11 6 3 7 9 8 10
1 5 2 8 6 11 7 9 3 10
1 5 2 8 6 3 7 9 11 10
1 5 2 3 6 11 7 9 8 10
1 5 2 3 6 8 7 9 11 10
1 3 2 11 6 8 7 9 5 10
1 3 2 11 6 5 7 9 8 10
1 3 2 8 6 11 7 9 5 10
1 3 2 8 6 5 7 9 11 10
1 3 2 5 6 11 7 9 8 10
1 3 2 5 6 8 7 9 11 10
  댓글 수: 6
Stephen23
Stephen23 2019년 5월 29일
편집: Stephen23 2019년 5월 29일
Here is a simple but not-very-efficient solution (warning: generates all permutations and discards invalid ones) (note that 1 and 10 have been ignored to make the code simpler):
b = [5,2,8,6,11,7,9,3];
V = [2,6,7,9]; % fixed
P = perms(b);
[X,Y] = ismember(P.',V);
R = reshape(Y(X),[],size(P,1));
D = all(diff(R,1,1)>0);
Z = P(D,:)
Giving:
Z =
3 11 8 2 6 7 9 5
3 11 8 2 6 7 5 9
3 11 8 2 6 5 7 9
3 11 8 2 5 6 7 9
3 11 8 5 2 6 7 9
3 11 2 6 8 7 9 5
3 11 2 6 8 7 5 9
3 11 2 6 8 5 7 9
3 11 2 6 7 8 9 5
... lots of lines here
5 3 2 11 6 7 8 9
5 3 2 11 6 7 9 8
5 3 2 11 8 6 7 9
5 3 2 6 11 8 7 9
5 3 2 6 11 7 8 9
5 3 2 6 11 7 9 8
5 3 2 6 8 11 7 9
5 3 2 6 8 7 11 9
5 3 2 6 8 7 9 11
5 3 2 6 7 8 11 9
5 3 2 6 7 8 9 11
5 3 2 6 7 11 8 9
5 3 2 6 7 11 9 8
5 3 2 6 7 9 11 8
5 3 2 6 7 9 8 11
5 3 2 8 6 11 7 9
5 3 2 8 6 7 11 9
5 3 2 8 6 7 9 11
5 3 2 8 11 6 7 9
Hang Vu
Hang Vu 2019년 5월 29일
Thank you so much! this is what I want!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Jan
Jan 2019년 5월 28일
편집: Jan 2019년 5월 28일
You did not mention how the output should look like. Perhaps:
b = [1,5,2,8,6,11,7,9,3,10];
keep = [1,2,6,7,9,10];
move = ~ismember(b, keep);
P = perms(b(move));
R = repmat(b, size(P,1), 1);
R(:, move) = P
  댓글 수: 6
Jan
Jan 2019년 5월 29일
@Hang Vu: I do not understand, what you mean. You solved the problem, but this is another one? Is the problem of your question solved or not?
"if the moving numbers move then you will see the keeping move..." - what does this mean?
Please explain exactly, what you want to achieve.
Hang Vu
Hang Vu 2019년 5월 29일
I am sorry, I miss-understood. I want to list all possible array of the moving numbers between the keeping one

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by