wolfram-mathematica - 从表达式中提取变量的实用程序

标签 wolfram-mathematica

我正在寻找一个实用程序,它将接受一个表达式并提取该表达式中的所有变量。
以下五个示例涵盖了我几乎所有的可变模式
a,Subscript[a,....],Subscript[a,...][...],a[...],a[...][...]
这是两个测试用例。

expr1 = -Log[Subscript[\[Mu], 2][]] Subscript[\[Mu], 2][] - 
   Log[Subscript[\[Mu], 2][2]] Subscript[\[Mu], 2][2] + 
   Log[Subscript[\[Beta], 1, 2][]] Subscript[\[Beta], 1, 2][] + 
   Log[2] Subscript[\[Beta], 1, 2][1] + 
   Log[Subscript[\[Beta], 1, 2][1]] Subscript[\[Beta], 1, 2][1] + 
   Log[2] Subscript[\[Beta], 1, 2][2] + 
   Log[Subscript[\[Beta], 1, 2][2]] Subscript[\[Beta], 1, 2][2] + 
   Log[Subscript[\[Beta], 2, 3][]] Subscript[\[Beta], 2, 3][] + 
   Log[Subscript[\[Beta], 2, 3][2]] Subscript[\[Beta], 2, 3][2] + 
   Log[2] Subscript[\[Beta], 2, 3][3] + 
   Log[Subscript[\[Beta], 2, 3][3]] Subscript[\[Beta], 2, 3][3];

expr2 = Log[\[Beta][{1, 2}][{}]] \[Beta][{1, 2}][{}] + 
  Log[2] \[Beta][{1, 2}][{1}] + 
  Log[\[Beta][{1, 2}][{1}]] \[Beta][{1, 2}][{1}] + 
  Log[2] \[Beta][{1, 2}][{2}] + 
  Log[\[Beta][{1, 2}][{2}]] \[Beta][{1, 2}][{2}] + 
  Log[\[Beta][{2, 3}][{}]] \[Beta][{2, 3}][{}] + 
  Log[\[Beta][{2, 3}][{2}]] \[Beta][{2, 3}][{2}] + 
  Log[2] \[Beta][{2, 3}][{3}] + 
  Log[\[Beta][{2, 3}][{3}]] \[Beta][{2, 3}][{3}] - 
  Log[\[Mu][{2}][{}]] \[Mu][{2}][{}] - 
  Log[\[Mu][{2}][{2}]] \[Mu][{2}][{2}]

On[Assert];
Assert[Union@extractVariables@expr1 === Union[Variables[expr1][[9 ;;]]]]
Assert[Union@extractVariables@expr2 === Union[Variables[expr2][[9 ;;]]]]

这是MrWizard的解决方案
extractVariables[formula_] := (
   pat = _Symbol[___][___] | Subscript[_Symbol, __][___] | Subscript[_Symbol, __] | _Symbol;
   Union@Cases[formula, pat, -1]
);

最佳答案

这是一些我用来获取各种类型的表达式(列表,方程,不等式和内部数字函数)中的“变量”的代码。

headlist = {Or, And, Equal, Unequal, Less, LessEqual, Greater, 
   GreaterEqual, Inequality};

getAllVariables[f_?NumericQ] := Sequence[]
getAllVariables[{}] := Sequence[]
getAllVariables[t_] /; MemberQ[headlist, t] := Sequence[]

getAllVariables[ll_List] := 
 Flatten[Union[Map[getAllVariables[#] &, ll]]]

getAllVariables[Derivative[n_Integer][f_][arg__]] := 
 getAllVariables[{arg}]

getAllVariables[f_Symbol[arg__]] := 
 Module[{fvars}, 
  If[MemberQ[Attributes[f], NumericFunction] || MemberQ[headlist, f], 
   fvars = getAllVariables[{arg}],(*else*)fvars = f[arg]];
  fvars]

getAllVariables[other_] := other

提供的测试中的一个示例:

在[36]中:= getAllVariables [expr2]

Out [36] = {Beta [{1,2}] [{}],[Beta] [{1,2}] [{1}],[Beta] [{1,
2}] [{2}],[Beta] [{2,3}] [{}],[Beta] [{2,3}] [{2}],[Beta] [{2,
3}] [{3}],[Mu] [{2}] [{}],[Mu] [{2}] [{2}]}

这可以扩展为处理更大的一类表达式,例如 bool 值,带有虚拟变量(例如Sum或Integrate)的数学以及一些程序构造。希望棘手的问题出现。

轶事:追溯到上个千年,内核部门的某个人安排了一次 session 来讨论“什么是变量?”问题。这是在Mathematica的设置范围内,而不是普通数学或CS。都一样,很难确定,因为不同的功能似乎对此类实体有不同的要求。我自己的看法是要答复我那天(预定 session 的那一天)会生病。我不记得是否有人问我是如何事先知道的...

丹尼尔·里奇布劳

关于wolfram-mathematica - 从表达式中提取变量的实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846644/

相关文章:

wolfram-mathematica - 如何在具有不透明度的 FillingStyle 中添加自定义 ColorFunction

arrays - CSV 的导入和导出在 Mathematica 中都被破坏了

wolfram-mathematica - 在 Mathematica 中使用 Manipulate 控制放置

ocaml - 从 OCaml 程序调用 Mathematica

wolfram-mathematica - Mathematica-为什么TreeForm [Unevaluated [4 ^ 5]]评估4 ^ 5?

C++ 数学 : Fitting a complicated function is not working

用于出版质量图的 Python Pylab pcolor 选项

wolfram-mathematica - 绘图曲线在 X 轴下方 - 修复了吗?

wolfram-mathematica - Mac 版 Wolfram Workbench 2.0 中 MUnit 的位置在哪里?

wolfram-mathematica - 具有无序子表达式的模式