wolfram-mathematica - 将 Evaluate 与纯函数和 SetDelayed 结合使用

标签 wolfram-mathematica

我想通过将列表传递给某个函数来评估下面的 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 询问您以后的问题。 .
您的问题不太可能成为风滚草,并且可能会被许多专家查看。


您可以使用 Witha 的值注入(inject)到 FunctionSetDelayed 的主体中:

With[{body = a},
 F[Z_] := body & @@ Z
]

检查定义:

Definition[F]
F[Z$_] := ({#1 #2, #2^2} &) @@ Z$

您会注意到,由于 automatic renamingZ 已变为 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$zEsc 表示形式 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/

相关文章:

wolfram-mathematica - 在 Mathematica 中舍入后匹配列表条目的最佳方法是什么?

wolfram-mathematica - 数学 : Show Complex Numbers in Polar Form

csv - 将 mathematica csv 导出中的数字转换为 numpy 复杂数组

python-3.x - IPython Notebook 有 "initialization cells"吗?

wolfram-mathematica - BarSpacing 选项是如何在 Mathematica 中真正实现的?

wolfram-mathematica - 将表达式拆分为术语集合

wolfram-mathematica - 如何减少Mathematica中自变量的数量

wolfram-mathematica - 为什么这行不通?选择中的动态

wolfram-mathematica - 在Mathematica中使用实函数

wolfram-mathematica - 为什么在 Windows/CDF 插件上运行的相同 Mathematica 演示在 Linux CDF 播放器上运行时返回不同的值?