【发布时间】:2017-07-31 21:31:27
【问题描述】:
我正在使用 Mathematica 将方程生成为 C 代码(使用 CForm[]),以便将方程导出为字符串并在 R 中使用。
例如,作为字符串导入 R 的 CForm[] 输出如下所示:
"Tau * Power(Omega * (-(R * Gamma) + R),(Tau + R))"
我的问题是如何最好地将上面的 C 代码转换成这样的 R 表达式:
Tau * (Omega * (-(R * Gamma) + R ))^(Tau + R)
根据之前一篇关于将 Mathematica 代码转换为 R 代码(Convert Mathematica equations into R code) 的建议,我知道一个合理的做法是将 Power() 重新定义为一个函数,即:
Power <- function(a,b) {a^b}
但是,通过一系列测试,我发现计算以下形式的表达式:
eval(parse(text="Tau * (Omega * (-(R * Gamma) + R ))^(Tau + R)"))
比将 Power() 定义为函数并评估以下内容要快得多(在我的 mac 上大约快 4 倍):
eval(parse(text="Tau * Power(Omega * (-(R * Gamma) + R),(Tau + R))"))
这似乎是一个复杂的模式匹配问题,但我找不到任何解决方案。我很感激任何建议。
【问题讨论】:
-
那不是标准的 C 代码,甚至不是表达式。
-
我提供的第一个代码是 Mathematica 输出的 CForm[] 的一部分,作为字符串导入 R。其余的都是 R 代码。谢谢。
-
@Olaf 是对的。这不是标准的 C 代码。不要盲目相信
CForm[]将 Mathematica 表达式转换为 C ... 看看 this -
感谢您的指点。我的问题与在 R 中操作字符串有关。我想通过提及字符串的创建方式来提供上下文,但 CForm[] 的使用并不是我的问题的核心。谢谢。
-
这不是 regexpr 的工作(尽管它可能有效),而是一个成熟的表达式解析器和作曲家。您可能会更好地使用真正的 C 函数并从 R 调用它或手动转换它,具体取决于您执行此操作的频率。 (当然,最好是为 Mathematica 找到一个 R 代码生成器!
标签: c r wolfram-mathematica