将 MathNet.Symbolics.ParseResult 转换为 MathNet.Symbolics.Expression
Converting MathNet.Symbolics.ParseResult to MathNet.Symbolics.Expression
我在尝试使用 MathNet.Symbolics 为表达式组合类似术语时遇到问题。对于以下代码,假设我的 'cleanResponse' 是 '2.5q+3.5q=6q'。
private static string CombineLikeTerms(string cleanResponse)
{
var root = GetDocumentTreeFromLaTeX(cleanResponse).Children[0];
LaTeXNode left = root.Children[1];
LaTeXNode right = root.Children[0];
var combinedLeft = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(left)))));
var combinedRight = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(right)))));
return combinedLeft + "=" + combinedRight;
}
我看到的问题是,返回值仍然是“2.5q+3.5q=6q”。现在,如果把'cleanResponse'改成'2q+4q=6q',返回的结果就是'6q=6q',这正是我所期望的。
我在这里找到了一些东西,https://github.com/mathnet/mathnet-symbolics/issues/3,它允许将类似的项与浮点数组合。但是,因为 Infix.Parse 方法 returns 是一个 ParseResult,而不是一个字符串值,所以我无法按原样使用它。
有谁知道将 ParseResult 转换为表达式的方法吗?
我不太确定我是否遵循了您在此代码示例中尝试实现的目标。例如,为什么要创建一个表达式,将其格式化为中缀,然后再将其解析回表达式?但也许我可以帮助澄清其中的一部分:
Infix.Parse
做return一个ParseResult
,这在C#中处理起来很不方便。这就是为什么在 C# 中我建议改用 Infix.ParseOrThrow
,它的工作方式相同,但直接 returns 一个表达式(或抛出异常),跳过 ParseResult
.
- Math.NET 符号中的中缀解析器不允许跳过乘法运算符,即您需要编写
2.5*q+3.5*q
. 而不是 2.5q+3.5q
- 像这样的表达式会自动简化,这就是
Infix.Format(Infix.ParseOrThrow("2.5*q+3.5*q"))
returns 6*q
的原因。在这种特殊情况下无需使用 Algebraic.Expand
。
Infix.Print
已弃用,请考虑改用 Infix.Format
。
看来您的代码可以简化为:
var left = Infix.ParseOrThrow("2.5*q+3.5*q");
var right = Infix.ParseOrThrow("6*q");
var combined = String.Format("{0}={1}", Infix.Format(left), Infix.Format(right));
其中组合将是 6*q=6*q
。
我在尝试使用 MathNet.Symbolics 为表达式组合类似术语时遇到问题。对于以下代码,假设我的 'cleanResponse' 是 '2.5q+3.5q=6q'。
private static string CombineLikeTerms(string cleanResponse)
{
var root = GetDocumentTreeFromLaTeX(cleanResponse).Children[0];
LaTeXNode left = root.Children[1];
LaTeXNode right = root.Children[0];
var combinedLeft = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(left)))));
var combinedRight = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(right)))));
return combinedLeft + "=" + combinedRight;
}
我看到的问题是,返回值仍然是“2.5q+3.5q=6q”。现在,如果把'cleanResponse'改成'2q+4q=6q',返回的结果就是'6q=6q',这正是我所期望的。
我在这里找到了一些东西,https://github.com/mathnet/mathnet-symbolics/issues/3,它允许将类似的项与浮点数组合。但是,因为 Infix.Parse 方法 returns 是一个 ParseResult,而不是一个字符串值,所以我无法按原样使用它。
有谁知道将 ParseResult 转换为表达式的方法吗?
我不太确定我是否遵循了您在此代码示例中尝试实现的目标。例如,为什么要创建一个表达式,将其格式化为中缀,然后再将其解析回表达式?但也许我可以帮助澄清其中的一部分:
Infix.Parse
做return一个ParseResult
,这在C#中处理起来很不方便。这就是为什么在 C# 中我建议改用Infix.ParseOrThrow
,它的工作方式相同,但直接 returns 一个表达式(或抛出异常),跳过ParseResult
.- Math.NET 符号中的中缀解析器不允许跳过乘法运算符,即您需要编写
2.5*q+3.5*q
. 而不是 - 像这样的表达式会自动简化,这就是
Infix.Format(Infix.ParseOrThrow("2.5*q+3.5*q"))
returns6*q
的原因。在这种特殊情况下无需使用Algebraic.Expand
。 Infix.Print
已弃用,请考虑改用Infix.Format
。
2.5q+3.5q
看来您的代码可以简化为:
var left = Infix.ParseOrThrow("2.5*q+3.5*q");
var right = Infix.ParseOrThrow("6*q");
var combined = String.Format("{0}={1}", Infix.Format(left), Infix.Format(right));
其中组合将是 6*q=6*q
。