【问题标题】:How to evaluate MathML expressions? [closed]如何评估 MathML 表达式? [关闭]
【发布时间】:2010-06-04 10:25:11
【问题描述】:

鉴于一些 MathML 内容:

<apply>
  <eq/>
  <ci>c</ci>
  <apply>
    <plus/>
    <ci>a</ci>
    <ci>b</ci>
  </apply>
</apply>

std::map<std::string,std::double> cal;
cal["a"] = 1.;
cal["b"] = 2.;
cal["c"] = 0; // does not matter what c is

我希望评估 MathML 并检索结果。有没有办法做到这一点?

【问题讨论】:

  • 我问这个是因为我不想重新发明轮子。我对自己编写代码很有信心。不需要对可能的实施提出建议。
  • 不需要演示。我只需要评估。
  • 任何人都可以推荐一个我可以使用的 C/C++ 数学评估库,即使它不能处理 MathML?

标签: c++ c xml mathml


【解决方案1】:

MathML 具有语义标记和表示标记。因此,无法使用通用的 MathML 解析器进行评估。

我不知道实际的实现,一些快速的谷歌搜索没有找到任何合理的结果,但它基本上归结为编写你的波兰表达式解释器(因为你给出的例子是波兰表示法)。步骤:

  1. 获取 XML 解析器并读取文档
  2. 穿过树
  3. 如果遇到已知操作或元素,将其弹出堆栈
  4. 当子表达式完成时,解析它(或者更好:等待整个表达式完成,寻找最后一个操作,按照它的arity 规定的参数数量执行它,直到没有操作为止)李>

最后,您将在堆栈中获得结果。

【讨论】:

    【解决方案2】:

    一种方法是找到可以导入 mathml 的计算机代数系统 (CAS)。不幸的是,虽然很多软件都导出了 mathml,但几乎没有一个软件会读取它。以下是一些cas系统的相关链接:

    CasADi(严格来说不是 CAS,但可以计算表达式): https://sourceforge.net/apps/trac/casadi/ticket/149

    同情: http://code.google.com/p/sympy/issues/detail?id=2971

    matlab/mupad: http://www.mathworks.nl/help/toolbox/mupad/generate/MathML.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多