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

hel*_*98x 4 wolfram-mathematica

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

rco*_*yer 12

简单来说,您修改后的问题很简单

f @@ {a,b,c,...} == f[a,b,c,...]
Run Code Online (Sandbox Code Playgroud)

哪里@@是简写Apply.在内部,{a,b,c}就是List[a,b,c](你可以通过看FullForm任何表达式),Apply只是取代了Head,List与一个新的Head,f,改变功能.通常,操作Apply不限于列表

f @@ g[a,b] == f[a,b]
Run Code Online (Sandbox Code Playgroud)

另外,看看Sequence哪个

f[Sequence[a,b]] == f[a,b]
Run Code Online (Sandbox Code Playgroud)

所以,我们可以这样做

f[ Sequence @@ {a,b}] == f[a,b]
Run Code Online (Sandbox Code Playgroud)

虽然迂腐似乎非常有用.

编辑:Apply有一个可选的第二个参数,指定一个级别,即

Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]}
Run Code Online (Sandbox Code Playgroud)

注意:正如这里所讨论的那样,简写Apply[fcn, expr,{1}]是指定您需要使用完整函数表单的任何其他级别描述.@@@


Dr.*_*ius 3

例如,对于两个元素

f[l_List]:=l[[1]]^2+l[[2]]^2  
Run Code Online (Sandbox Code Playgroud)

对于任意数量的元素

g[l_List] := l.l
Run Code Online (Sandbox Code Playgroud)

或者

h[l_List]:= Norm[l]^2
Run Code Online (Sandbox Code Playgroud)

所以:

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

{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2}  
Run Code Online (Sandbox Code Playgroud)

还有两个,只是为了好玩:

i[l_List] := Total@Table[j^2, {j, l}]

j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]]  
Run Code Online (Sandbox Code Playgroud)

编辑

关于你的定义

f[{__}] = a ^ 2 + b ^ 2;  
Run Code Online (Sandbox Code Playgroud)

它有几个问题:

1)您正在定义一个常量,因为它们a,b不是参数。
2) 您正在使用 Set 而不是 SetDelayed 定义函数,因此评估会立即完成。举个例子试试

 s[l_List] = Total[l]
Run Code Online (Sandbox Code Playgroud)

与正确的方法相比:

 s[l_List] := Total[l]  
Run Code Online (Sandbox Code Playgroud)

在您使用它之前,它保持未评估状态。

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

f[{a_,b_}]:= a^2+b^2;
Run Code Online (Sandbox Code Playgroud)