我正在寻找一个实用程序,它将接受一个表达式并提取该表达式中的所有变量。
以下五个示例涵盖了我几乎所有的可变模式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/