2011-03-03 74 views
4

如何将值传递给具有多个变量的给定表达式?这些变量的值放置在需要传入表达式的列表中。将列表中存储的参数传递给表达式

+3

@ user642327请允许我欢迎你们来的StackOverflow,并提醒三件事,我们通常在这里做的:1)当你得到帮助,尽量给它太**回答问题**你专业2)的面积['阅读常见问题解答](http://tinyurl.com/2vycnvr)3)当您看到好的问答时,请将它们投票['使用灰色三角形](http://i.imgur.com/kygEP.png)“该系统的可信度基于用户通过分享知识获得的声誉。另外请记住接受更好地解决您的问题的答案,如果有的话,['通过按复选标记](http://i.imgur.com/uqJeW.png) – 2011-03-03 04:05:20

回答

3

例如,对于两个元件

f[l_List]:=l[[1]]^2+l[[2]]^2 

为任何数量的元件

g[l_List] := l.l 

h[l_List]:= Norm[l]^2 

因此的:

Print[{f[{a, b}], g[{a, b}], h[{a, b}]}] 

{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2} 

两个,只是为了好玩:

i[l_List] := [email protected][j^2, {j, l}] 

j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]] 

编辑

关于你的定义

f[{__}] = a^2 + b^2; 

它有几个问题:

1)你要定义一个常量,因为a,b不是参数。
2)您正在使用Set定义一个函数,而不是SetDelayed,因此评估立即完成。刚刚尝试例如

s[l_List] = Total[l] 

与正确的方式:

s[l_List] := Total[l] 

使用之前将其保持不计算。

3)您使用的图案没有名称{__},因此您不能在表达式的右侧使用它。正确的做法可能是:

f[{a_,b_}]:= a^2+b^2; 
4

一对夫妇的其他方式...

  1. 使用规则置换

    f /. Thread[{a,b} -> l]

    (其中Thread[{a,b} -> l]将评估为{a->1, b->2}

  2. 使用纯函数

    Function[{a,b}, Evaluate[f]] @@ l

    (其中@@是一种形式的应用[]和Evaluate[f]用于将功能成Function[{a,b}, a^2+b^2]

+0

是的。我们可以写一个博客:1001种方法来获得'SquaredEuclideanDistance []'而不提及它。 :D – 2011-03-03 04:03:47

+0

我避免提及Dot [l,l] b/c我认为它有点太过于关注问题的细节... – 2011-03-03 04:18:28

+0

...直到现在,就是这样。 :-) – 2011-03-03 04:18:54

12

你的修订的问题是简单的,只需

f @@ {a,b,c,...} == f[a,b,c,...] 

其中@@是简写Apply 。在内部,{a,b,c}List[a,b,c](您可以在任何表达式上使用FullForm查看),而Apply只是用Head,List,用新的Head,f更改函数。的Apply操作并不局限于名单,一般

f @@ g[a,b] == f[a,b] 

而且,看Sequence这确实

f[Sequence[a,b]] == f[a,b] 

所以,我们能做到这一点,而不是

f[ Sequence @@ {a,b}] == f[a,b] 

其中而迂腐看起来可能非常有用。

编辑Apply有一个可选的2 第二参数,指定一个水平,即

Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]} 

注:Apply[fcn, expr,{1}]速记是@@@,如所讨论的here,但以指定任何其他级描述你需要使用全功能表格。

相关问题