2010-11-08 90 views
0

原始問題:Mathematica Map問題

我知道Mathematica有一個內置的map(f,x),但是這個函數是什麼樣的?我知道你需要查看列表中的每個元素。

任何幫助或建議?

編輯(由Jefromi,從邁克的意見拼湊起來):

我工作的程序有什麼需要通過像地圖中的列表中移動,但我不能使用它。我也不允許使用表格;我需要在沒有其他功能幫助的情況下移動列表。我正在研究一個遞歸版本,我有一個空的列表,但是移動一個列表中的項目並不能解決問題。這是我的第一個案例:newMap[#, {}] = {}(空列表的地圖只是一個空列表)

+0

你是什麼意思「這個函數是什麼樣的」?我假設你在問'Map';你看過[文檔](http://reference.wolfram.com/mathematica/ref/Map.html)嗎?那裏有什麼讓你感到困惑嗎? – Cascabel 2010-11-08 18:43:13

+0

我不確定你在找什麼。你在尋找'Map'(參數佈局)的簽名,它是如何運作的,或者它是如何實現的? – rcollyer 2010-11-08 18:45:17

+0

我正在尋找它是如何運作的,如何在mathematica中遞歸地移動一個列表,特別是Map中的第一個參數是什麼,如果我自己寫的是我自己所知的如何實現Map(__,List)放在第一支架? – Mike 2010-11-08 18:51:10

回答

1

要回答您在註釋中提出的問題,Map中的第一個參數是一個接受單個參數的函數。這可以是一個純函數或函數的名稱已經只接受像

In[1]:=f[x_]:= x + 2 
     Map[f, {1,2,3}] 
Out[1]:={3,4,5} 

至於如何使用您自己設計...的遞歸函數替換Map繼Jefromi的例子一個參數,我我不會放棄太多,因爲這是作業。但是,顯然你需要某種方式來操作列表的一部分,同時保持列表的其餘部分完整無缺,以用於遞歸部分的map函數。正如他所說,Part是一個很好的起點,但我會看看它引用的一些其他功能,看看它們是否更有用,比如FirstRest。另外,我可以看到Flatten會有用。最後,你需要一種方法來結束遞歸,所以學習如何約束模式可能會很有用。順便提一句,這可以在一行或兩行中完成,具體取決於是否爲地圖創建了第二個定義(更簡單的方法),或者不是。

提示:現在,你有你的結束條件,你需要回答三個問題:

  1. 如何從我的列表中提取單個元素,
  2. 我怎麼引用其餘元素的名單,並
  3. 我怎麼把它放回到一起?

它有助於思考過程中的一個步驟,以及您需要在該步驟中完成哪些步驟。

+0

鑑於表不允許,First/Rest在這裏絕對是很好的成語。 – Cascabel 2010-11-08 20:18:49

6

我發佈了一個遞歸解決方案,但後來決定刪除它,因爲從評論這聽起來像一個家庭作業問題,我通常是一個教魚對象。

您正在使用定義newMap[f_, {}] := {}的遞歸解決方案。

Mathematica的模式匹配是你的朋友。考慮如何實現newMap[f_, {e_}]的定義,並從那裏執行newMap[f_, {e_, rest___}]

最後一個提示:一旦您可以定義最後一個功能,您實際上並不需要{e_}的情況。

UPDATE

根據您的意見,也許這個例子可以幫助您瞭解如何應用任意的功能:

func[a_, b_] := a[b] 

In[4]:= func[Abs, x] 
Out[4]= Abs[x] 

SOLUTION

由於OP抓了魚,可以這麼說,(恭喜!)這裏有兩個遞歸解決方案,以滿足任何旁觀者的好奇心。這第一個可能就是我會考慮「慣用的」數學:

map1[f_, {}] := {} 
map1[f_, {e_, rest___}] := {f[e], [email protected]@map1[f,{rest}]} 

這裏是沒有利用模式匹配相當多,這基本上是什麼OP結束了與方法:

map2[f_, {}] := {} 
map2[f_, lis_] := {f[First[lis]], [email protected]@map2[f, Rest[lis]]} 

{f[e], [email protected]@map[f,{rest}]}部分可以以各種等效方式來表達,例如:

  • Prepend[map[f, {rest}], f[e]]
  • Join[{f[e]}, map[f, {rest}](@Mike使用此方法)
  • Flatten[{{f[e]}, map[f, {rest}]}, 1]

我要把它留給讀者去思考的更多,並思考的多數那些=對性能的影響)

最後,爲了好玩,這裏是一個程序版本,儘管寫它讓我有點噁心:;-)

map3[f_, lis_] := 
(* copy lis since it is read-only *) 
Module[{ret = lis, i}, 
    For[i = 1, i <= Length[lis], i++, 
    ret[[i]] = f[lis[[i]]] 
    ]; 
    ret 
    ] 
+0

+1,單獨的模式爲「{e_,rest ___}」。我希望我用這些術語思考比我更多的東西。而且,不需要額外的功能。 – rcollyer 2010-11-08 20:18:03

+0

+1;模式匹配的優雅讓我想起我有多想念Mathematica。 – Cascabel 2010-11-08 20:21:11

+0

我可以想象使用'First'和'Rest'的優點:變量'rest'不是指列表。但是,這很容易被克服,如果你需要儘可能地避免外部功能,沒有什麼能夠勝過模式。 – rcollyer 2010-11-08 21:39:07