2010-12-28 5 views
5

벡터 v를 취하여 어떤 방식 으로든 변환 된 요소가있는 새 벡터를 반환하는 함수 f가 있다고 가정합니다. 벡터가 정렬되어 있다고 가정하는 g 함수를 호출하면됩니다. 그래서 f는과 같이 정의 할 :Unsort : 순열을 기억하고 취소하기

f[v_] := Module[{s, r}, 
    s = Sort[v]; (* remember the permutation applied in order to sort v *) 
    r = g[s]; 
    Unsort[r]  (* apply the inverse of that permutation *) 
] 

은 "정렬 안함"을 할 수있는 가장 좋은 방법은 무엇입니까?

이 아니면 어떻게 든 일을 정말 멋진 얻을이있을 수 있습니다 :

answer = Unsort[g[Sort[v]]]; 

추가 된 :의 장난감 예제이 콘크리트를 만들어 보자. 벡터를 취하고 각 요소에 다음에 가장 작은 요소가있는 경우 해당 요소를 추가하여 변환하는 함수 f가 필요하다고 가정 해 보겠습니다. V 정렬 여부에 관계없이 작동 우리가 정말 원하는 기능, F 지금

g[v_] := v + Prepend[[email protected], 0] 

: 즉 우리가 벡터 정렬 가정하면, 쓰기, 그래서 그 가정을 만드는 도우미 함수 g를 작성할 수 있도록 쉽게 : TomD와 야로슬라프에

f[v_] := (* remember the order; 
      sort it; 
      call g on it; 
      put it back in the original order; 
      return it 
     *) 

답변

2

덕분에, 여기에 그것을 할 수있는 가장 간결/우아한 방법 아마 :

f[v_] := g[[email protected]][[[email protected]@v]] 

그리고 야누스 덕분에, 여기에 아마도 더 effic있어 ient 방법 :

: 그것은 2 종류 대신 후손 3.

을한다는 것을

f[v_] := With[{o = [email protected]}, g[v[[o]]][[[email protected]]]] 

주, 여기에 내가 그 위를 통해 추천 아무것도 있다고 생각하지 않습니다하지만, 내 원래의 시도이다

f[v_] := With[{o = Ordering[v]}, Sort[Transpose[{o,g[v[[o]]]}]][[All,-1]]] 

의견에서 belisarius를 해결하기 위해 g를 매개 변수로 전달하지 않는 이유는 g를 f의 도우미 함수로 생각하기 때문입니다. 인수가 정렬 된 벡터라고 가정 할 수 있으면 작성하기가 더 쉬운 함수 f가있는 것 같습니다. 그래서 나는 이것을 가정하고이 래퍼 트릭을하는 버전을 쓴다.

+1

아마 매개 변수로 ** g **를 전달하는 것이 좋습니다. –

+1

또는 약간 더 효율적으로 원본을 With [{o = Ordering [v]}, Part [g [v [[o]]], Ordering [o]]]'로 변경하십시오. – Janus

6

한가지 가능한 방법

mylist = {c, 1, a, b, 2, 4, h, \[Pi]} 
    g /@ ([email protected])[[[email protected]@mylist]] 

{g [C], g 1, g [A], g [B], g [2], g [4], g을 준다 [H], g [파이]} I 원래의 Andrzej Kozlowsk 의해 포스트로부터 MathGroup [EDITED]로부터 상기 알게

([email protected])[[[email protected]@mylist]] == mylist 

이다

, 내가

http://forums.wolfram.com/mathgroup/archive/2007/Jun/msg00920.html

+1

주문^(2n) === 주문^2; Ordering^(2n + 1) === Ordering : D –

3

여기 마이클 PILAT하여 "정렬 래퍼"패턴 suggested의 이전

Clear[g]; 
g[a_] := If[OrderedQ[a], a^2, Print["Failed"]]; 
g[{3, 2, 1}] 
g[a_] := g[[email protected]][[[email protected]@a]] /; Not[OrderedQ[a]]; 
g[{3, 2, 1}] 
+0

처음에는 혼란 스러웠습니다. 우리는 함수 g가 무엇인지에 관해서는 같은 페이지에 있지 않았기 때문에 생각합니다. 내 답변에 대한 업데이트를 참조하십시오. 그러나 잠시 기다려주세요, 당신이 여기에서하는 일은 두 가지 버전의 f를 사용하여 별도의 도우미 함수 (g라고 부르는 것)의 필요성을 없애는 것입니다. 똑똑한! 나는 이것이 당신이 여기에서 g를 없애 버린다면 덜 혼란 스러울 것이라고 생각한다. – dreeves

관련 문제