我对Mathematica比较陌生,虽然我熟悉很多编码惯例,但我对Mathematica使用@,@,#,%和&等符号的方式一无所知。在命令中。具体来说,我正在寻找帮助,使用GatherBy
对包含i
对的列表cases
的对进行分组。
我一直在使用e = GatherBy[cases, MemberQ[#, i] &];
,当我在我的函数范围之外测试它时,它正常工作,但当放入功能模块时,而不是搜索cases
,它正在搜索一些我在我的函数中声明的其他列表。
我认为这种情况正在发生,因为我滥用#
符号(也可能是&
符号)。
请帮助指导我做错的事情和/或所有这些符号的某些文档及其在Mathematica中的用法。
非常感谢您提供给我的任何和所有帮助。
干杯!
修改
以下是对我的功能的更多解释
distill[mono_] := Module[{cases, e, f, g, h, check, res},
cases = FactorList[mono];
cases = Cases[cases, {P[_Integer, _Integer], _}];
(*Flatten the list*)
cases = Flatten[cases];
(*Remove the extra 1s *)
cases = Cases[cases, P[_Integer, _Integer]];
cases = cases //. P[r_, q_] :> {r, q};
(*Create equivalance list on the points*)
(映射值是一个全局数组,包含对中的所有可能值)
For[i = mappedVals[[1]], i <= Length[mappedVals]/2, i++,
Print[i];
e = GatherBy[cases, MemberQ[#, i] &];
If[Position[e[[1]], i] == {}, f = Flatten[e[[2]]],
f = Flatten[e[[1]]]];
If[Position[e[[1]], i] == {}, check = 0, check = 1];
g = Union[f];
If[check == 0, h = e[[1]], h = e[[2]] ];
cases = Append[h, g];
];
cases
];
我希望将此函数传递给单项式,例如-q P [41,42] P [41,43] P [42,43],并最终在这些点上创建等价类。 P[a,b]
表示在我描绘的模型中,节点a
和节点b
之间存在连接。在这个例子中,我希望输出的等价类是{41,42,43},因为41连接到42,它连接到43.对于更多非平凡的例子,我希望对P[41,42]P[41,43]P[42,43]P[44,45]P[44,45]
到产生等价类{{41,42,43},{44,45}},因为44和45属于它们自己的类型并且没有连接到任何其他值。我通过将单项式变成因子列表,仅选择对,将对转换为更可行的格式,然后启动我的算法来构造类来创建这些等价类。这是算法的要点......
- 以全局列表mappedVals
中的第一个可能值开始(包含对中的所有可能值)
- 使用GatherBy
收集包含测试值的所有点(旁注:GatherBy
并不总是将包含值的对作为返回列表中的第一个元素,因此我使用了{{ 1}}函数检查两个元素中哪一个包含测试值的对)
- 形成包含测试值的所有对的并集,然后用对的并集替换所有对
- 对所有可能的值重复此操作,直到PositionQ
包含我前面提到的定义所定义的所有等价类
我的错误显示为cases
,其中41是第一个测试值,因为它位于Set::partw: Part 41 of {-q^4 (1/q+q) (1/T+T),2 q^2 (1/q+q) (1/T+T),-q P[41,42] P[41,43] P[42,43],-q (1/T+T)^3,-q P[41,42] P[41,43] P[42,43],(1/q+q) (1/T+T)} does not exist. >>
中,而长,恶心的集合是我的代码中其他位置使用的全局变量。
我认为我的问题在于调用函数mappedVals[[1]]
。我正在尝试搜索e = GatherBy[cases, MemberQ[#, i] &];
形式为cases
的对象,例如包含41个。
很抱歉这么啰嗦,但我真的很感激任何帮助。