将存储在列表中的参数传递给表达式

时间:2011-03-03 03:46:29

标签: wolfram-mathematica

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

3 个答案:

答案 0 :(得分:12)

您修改后的问题很简单,只需

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

其中@@Apply的简写。在内部,{a,b,c}List[a,b,c](您可以在任何表达式上使用FullForm查看),而Apply只是替换HeadList ,使用新的Headf,更改功能。 Apply的操作通常不仅限于列表

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

另外,请查看<{3}}

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

所以,我们可以这样做

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

虽然迂腐似乎非常有用。

编辑Apply有一个可选的2 nd 参数,用于指定级别,即

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

注意:Apply[fcn, expr,{1}]的简写为@@@,正如Sequence所述,但要指定您需要使用完整功能表单的任何其他级别描述。

答案 1 :(得分:4)

其他两种方式......

  1. 使用规则替换

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

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

  2. 使用纯函数

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

    (其中@@是Apply []的一种形式,Evaluate[f]用于将函数转换为Function[{a,b}, a^2+b^2]

答案 2 :(得分: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] := Total@Table[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]

VS。正确的方式:

 s[l_List] := Total[l]  

在您使用它之前仍未评估。

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

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