2017-03-28 5 views
0

나는 매트릭스가 [1 2 3 4]이고 몇 시간 안에 randperm으로 셔플하고 싶지만 다른 매트릭스를 얻고 싶습니다. 예를 들어,randperm에서 서로 다른 순서를 얻을 수있는 방법이 있습니까?

for i=1:4  
    m(i,:)=randperm(4); 
end 

은 4 열로 나에게 4 행을 줄 것이지만 모든 행마다 다른 행을 원합니다. 예 : 이 같은 :

m(1,:)=[1 3 4 2] 
m(2,:)=[2 3 1 4] 
m(3,:)=[2 1 4 3] 
m(4,:)=[4 3 2 3] 
+0

실제 코드에서 몇 개의 요소를 치환하고 있습니까? 4를 사용하고 있습니까? 40? – beaker

+0

9 개의 요소에 대한 순열을 지정합니다. 40을 사용하면 4보다 다른 점은 무엇입니까? –

+0

내가 제안하려고하는 접근법은 모든 순열을 생성 한 다음 해당 순열의 인덱스를 순열하기 때문에 차이가있을 것입니다. 9 생성 중! 순열이 가능하다. 40 생성 중! 순열은 그렇지 않다. 하지만 수 에버 (Suever)는 같은 접근법을 제안했습니다. :) – beaker

답변

3

당신은 단지 또 다른 (메모리 집약적 인) 접근 방식이 될 것이다 현재 순열 이미

m = zeros(4, 4); 

counter = 1; 

while counter < 4 
    new = randperm(4); 
    if ~ismember(new, m, 'rows') 
     m(counter, :) = new; 
     counter = counter + 1; 
    end 
end 

존재 있는지 확인하기 위해 기존 행을 확인할 수 있습니다 모든 순열을 생성 한 다음 임의로 N을 선택하십시오.

allperms = perms(1:4); 
N = 4; 

m = allperms(randsample(size(allperms,1), N), :); 
+0

'randi (size (allperms, 1), N, 1)'는 선택된 순열이 다른 것을 보장하지 않습니다. 'randsample (size (allperms, 1), N)'이 아닌가? –

+0

@LuisMendo Doh 네 말이 맞다. 오늘 커피가 부족합니다 :) 감사합니다 – Suever

+0

감사합니다 @ 수혈이 내 목표를 달성했습니다. –

1

쉽게 방금 만든 임의 치환 이미 매트릭스에 포함되어 있는지 확인하기 위해 MATLAB 기능 ismember을 사용할 수 있습니다.

그래서 당신은 그런 뭔가를 시도 할 수 있습니다 :

for i=1:4 
    temp = randperm(4); 
    while ismember(m,temp,'rows') 
     temp = randperm(4); 
    end 
    m(i,:) = temp; 
end 
+0

감사합니다. –