2012-10-28 3 views
10

다음과 같은 문제가 있습니다. 나는 집합의 순열을 계산할 필요가있다. 그러나 세트에는 동일하고 반복적 인 순열을 야기하는 두 개의 요소가 포함될 수 있습니다. 예를 들어 :효율적으로 고유 순열 찾기

1  2  0  0 
1  2  0  0 

그러나, 나는 이들과 같은 동일한 순열을 피하기 위해 싶습니다 세트 [ 0 0 1 2 ]을 감안할 때

는 순열은 이러한 가능성을 포함한다.

unique(perms([ 0 0 1 2 ]), 'rows') 

을 그러나 여기에서 문제는 효율성이다 - 나는 거대한 for 루프에서 반복적으로이 일을하고 있고 unique에 필요한 정렬이 너무 느립니다 : MATLAB에서 나는 단순히이 작업을 수행 할 수 있습니다. 그래서 내 질문은 : 나는 직접의 독특한 순열을 계산할 수 있습니까? 나중에 결과를 반복하지 않아도됩니까? 저는 MATLAB에서 일하고 있습니다 만, MATLAB에서 벡터화 될 수있는 것이 이상적 일지 모르지만 단지 일반적인 해결책이 도움이 될 것입니다!

기존의 질문은이 문제를 정확하게 다루지는 못하지만, 이전에 답을 얻었다면 사과드립니다.

+0

정말 어떤 문제를 해결하려고합니까? 왜 다른 어레이의 순열을 고속으로 찾아야하는지 루프가 있습니까? – nibot

+0

좋은 점, 조금 더러워 지지만, 좀 더 구체적이어야했습니다. 객체와 관련된 클래스가 있지만 이미지간에 해당 객체 세트의 방법을 찾고 있습니다. 나는 집합 A에서 한 번에 5 개의 객체를 가져 와서 집합 B의 객체에 해당하는 모든 방법을 찾습니다. 각 클래스 내에서 순열을 찾아 클래스 제한을 처리합니다. 이것이 제로 (zeros)가되는 이유입니다. 그것들은 다른 객체와 쌍을 이루지 않는 객체를 나타냅니다. 그래서 나는 그러한 순열을 반복하고 싶지 않습니다. – jazzbassrob

답변

3

이 문제는 정기적으로 발생하는 것으로 보입니다. Here은 John d' Errico (uniqueperms)의 파일로 매우 효과적으로 다루는 것 같습니다. 대안으로 Ged Ridgway의 다른 FEX 제출 here; 어느 것이 더 빠를지를보기 위해 약간의 프로필을 만들어야합니다.

Matlab의 JIT의 제한으로 인해 루프가 내장되지 않은 함수를 호출하면 루프가 가속되지 않으므로이 함수의 내용을 복사하여 붙여 넣기 (및/또는 조금 특화)하는 것이 유용 할 수 있습니다 귀하의 루프.

+0

아, 그게 다, 고마워! 내 인터넷 검색 기능은 분명히 연습이 필요합니다! – jazzbassrob