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が必要であるとします。 我々はベクトルがソートされていると仮定した場合に書くのは簡単だが、それでは、その仮定を作るヘルパー関数g書いてみましょう:Vがソートされているか否かの作品たちが本当にしたい関数f、のための今すぐ

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

を:

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

答えて

2

TomDとヤロスラフのおかげで、ここではおそらくそれを行うための最も簡潔な/エレガントな方法です:

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

おそらくそれがパラメータとして**グラム**を渡す方が良いでしょう。 –

+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 [[PI]}

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

Iが最初アンジェイKozlowskによってポストからMathGroup、[EDITED]から上記の学習しました私

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の2つのバージョンを持つことによって別々のヘルパー関数(私がgと呼ぶもの)の必要性を取り除くことです。スマート!あなたがここでgを取り除くと、これはあまり混乱しないだろうと思います。 – dreeves

関連する問題