我想通过将列表传递给某个函数来评估下面的 f:
f = {z[1] z[2], z[2]^2};
a = % /. {z[1]-> #1,z[2]-> #2};
F[Z_] := Evaluate[a] & @@ Z ;
所以现在如果我尝试 F[{1,2}]
我会按预期得到 {2, 4}
。但仔细观察?F
会返回定义
F[Z_] := (Evaluate[a] &) @@ Z
这取决于 a
的值,因此如果我们设置 a=3
然后计算 F[{1,2}]
,我们得到3
。我知道添加最后一个 &
会使 Evaluate[a]
成立,但是什么是优雅的解决方法呢?本质上我需要强制评估Evaluate[a]
,主要是为了提高效率,因为a
实际上相当复杂。
有人可以帮忙吗,并考虑到 f
必须包含由某些未知计算给出的 Array[z,2]
。所以写一下
F[Z_] := {Z[[1]]Z[[2]],Z[[2]]^2}
这还不够,我需要从我们的 f
自动生成它。
非常感谢您的贡献。
最佳答案
请考虑通过 dedicated StackExchange site for Mathematica 询问您以后的问题。 .
您的问题不太可能成为风滚草,并且可能会被许多专家查看。
您可以使用 With
将 a
的值注入(inject)到 Function
和 SetDelayed
的主体中:
With[{body = a},
F[Z_] := body & @@ Z
]
检查定义:
Definition[F]
F[Z$_] := ({#1 #2, #2^2} &) @@ Z$
您会注意到,由于 automatic renaming,Z
已变为 Z$
在嵌套的作用域构造中,但行为是相同的。
在评论中您说:
And again it bothers me that if the values of
z[i]
were changed, then this workaround would fail.
虽然在如上定义 F[Z_]
后这应该不是问题,但如果您希望保护 a
的替换> 您可以使用形式符号代替 z
。这些是通过例如Esc$z
Esc 表示形式 z。形式符号具有 protected 属性,并且专门为了避免此类冲突而存在。
这在笔记本中看起来比在这里要好得多:
f = {\[FormalZ][1] \[FormalZ][2], \[FormalZ][2]^2};
a = f /. {\[FormalZ][1] -> #1, \[FormalZ][2] -> #2};
另一种方法是在 Hold
表达式内进行替换,并使用 Unevaluated
保护规则本身免于计算:
ClearAll[f, z, a, F, Z]
z[2] = "Fail!";
f = Hold[{z[1] z[2], z[2]^2}];
a = f /. Unevaluated[{z[1] -> #1, z[2] -> #2}] // ReleaseHold;
With[{body = a},
F[Z_] := body & @@ Z
]
Definition[F]
F[Z$_] := ({#1 #2, #2^2} &) @@ Z$
关于wolfram-mathematica - 将 Evaluate 与纯函数和 SetDelayed 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977719/