2013-06-21 93 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}} *)