2011-11-07 1 views
4

Mathematica에서 데이터 목록의 일부 요소를 삭제하려고 시도하지만 SelectUnion이 어떻게 작동하는지 이해할 수 없습니다. 예를 들어, 나는 다음과 같은 목록을데이터 목록에서 중복 점 선택

list = {{0.10,0.20},{1.10,0.20},{0.70,0.80},{0.20,1.10}, 
    {1.20,1.20},{0.12,0.18},{0.68,0.76}} 

이 만 0.05의 거리 반경 내에서 포인트가 중복되는 것을 고려 (0,1)x(0,1)의 요소를한다고 가정합니다. 예에서

list1 ={{0.10,0.20},{0.70,0.80}} 

요소는 동등한 클래스를 나타냅니다. 내가 Union를 사용하려고하면

Union[list1, SameTest -> (Abs[#1-#2] < 0.05 &)] 

같은

내가 슬롯 오류를 얻을

list1 = Select[list, 0 < Part[#,1] <1 &];Select[list,0 < Part[#,2] <1 &] 

느릅 나무가 (0,1)x(0,1)에 포인트를 제공하지만 : 임 다음을 수행.

누군가가 내게 어떻게 깔끔하게 그것을 설명 할 수 있습니까?

DeleteDuplicates[list1, Abs[Part[#1, 1] - Part[#2, 1]] < 10^-6 &] 

를 사용

--- 편집 --- 트릭 않습니다,하지만 난 목록 목록 작업을하지 못할 이유가 궁금합니다.

+2

이 나에 유래에 당신을 환영하고 우리가 일반적으로 여기에서 세 가지를 생각 나게 할 수 있도록 허용 : 당신이 도움을받을로서 1), 질문에 대답 **도 그것을 제공하려고 **에 귀하의 전문 분야 2) ['FAQ 읽기'] (http://tinyurl.com/2vycnvr) 3) 좋은 Q & A를 볼 때 [회색 삼각형을 사용하여] 투표하십시오 (http : // i .imgur.com/kygEP.png) 시스템의 신뢰성은 사용자가 자신의 지식을 공유함으로써 얻을 수있는 평판을 기반으로합니다. 또한 문제가있는 경우 문제를 해결하는 대답을 수락하는 것을 잊지 마십시오. (체크 표시를 눌러서) –

답변

4

이 방법에는 몇 가지가 있습니다. 한 가지 방법은 내가 생각하기에 가장 깔끔한 것입니다. 특정 요소를 특정 간격으로 사용해야하기 때문에 IntervalMemberQSelect과 함께 사용하는 것입니다.

예를 들어, (0,1)x(0,1)에 그 포인트로 목록의 범위를 좁히려면 : 두 번째

list01 = Select[list, And @@ IntervalMemberQ[Interval[{0, 1}], #] &] 

Out[1]= {{0.1, 0.2}, {0.7, 0.8}, {0.12, 0.18}, {0.68, 0.76}} 

를,이 작업을위한 완벽한 도구 인 DeleteDuplicates를 사용하여 중복을 제거 할 수 있습니다. 당신은 IntervalMemberQ를 사용하여 동일한 테스트를 사용할 수 있습니다

DeleteDuplicates[list01, 
And @@ IntervalMemberQ[Interval[{0, 0.5}], Abs[#1 - #2]] &] 

Out[2]= {{0.1, 0.2}, {0.7, 0.8}} 
+0

대단히 감사합니다. 이렇게하면 문제가 해결됩니다. 왜이 경우에는 슬롯 오류가 없는지 이해할 수 없습니다. Part를 사용하는 이유입니다. – Pragabhava

+0

@Manuel'DeleteDuplicates'는 모든 요소 쌍을 검사합니다. 각 요소는'list01'의 하위 목록입니다. '# 1'슬롯은 쌍 중 첫 번째 슬롯을 의미하고 '# 2'는 두 번째 슬롯을 의미합니다. – abcd

+0

나는 그것을 좋아한다. 그러나 때로는 속이는 것입니다. 예를 들어'list01 = Union [튜플 [{1, 0}, 2], {{1/2, 1/2}}]'을 시도하십시오. {0,0}을 (를) 반환하지만 {1,1}은 등가 범위 밖에 있습니다. –