2013-06-21 147 views
2

我有一個函數f[d_]。我的意圖是將這個函數作爲一個整體應用到列表中。 說,​​,然後f[d]給了我一個結果(一個數字或其他)。在此之前,一切都很清楚。Mathematica:將函數應用到列表中

現在可以說我有列出的以下列表:p={l1,l2,l3,...} 有沒有更有效的方法比地圖計算f[p],在該預期的結果{f[l1],f[l2],f[l3],...}

例如,使用Sin[x]函數,將它映射到列表比將列表放入其參數中要慢得多。這似乎不適用於我的功能f[d]和列表p。我該怎麼做才能做到這一點?它會比Map更快嗎?

爲了讓自己更清楚,說

f[d_]:=Total[d] 
Then, f[{a1,a2,a3}] gives me a1+a2+a3, as expected. 
But, f[{{a1, a2, a3}, {b1, b2, b3}, {c1, c2, c3, c4}}] kills the machine. 

謝謝!

+0

你需要像'總[{{a1,a2,a3},{b1,b2,b3},{c1,c2,c3,c4}},{2}]'? – tomd

+0

嘗試使用listable屬性:'SetAttribbutes [f,Listable]' – agentp

回答

1

當我改變你的代碼,它提供了:

 Total[{{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3}}] 
    {a1 + b1 + c1, b1 + b2 + c2, b3 + c1 + c3} 

當總花費清單的說法,它只是添加成員,在你的情況下,它增加了

{a1, b1, c1},{b1, b2, b3}, {c1, c2, c3} 

但他們並不相同的維度,所以你不能得到正確的答案。

在這種情況下,應該使用地圖。

Map[Total,{{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3, c4}}] 

Plus @@@ {{a1, b1, c1}, {b1, b2, b3}, {c1, c2, c3, c4}} 
+0

感謝您的幫助 – Ivan

0

對不起可列犯規在這裏做的工作.. 你可以把地圖功能裏面是否有幫助..

ClearAll[f] 
f[d_List] := Map[ Total, d, {-2}] 
f[{1, 2, 3}] 
f[{{1, 2, 3}, {4, 5}}] 
f[{{{1, 2, 3}, {4, 5}}, {{6}, {7, 8}}}] 

(* 6 *) 
(* {6, 9} *) 
(* {{6, 9}, {6, 15}} *)