我对 Mathematica 比较陌生,虽然我熟悉许多编码约定,但我对 Mathematica 在命令中使用 @、@@、#、% 和 & 等符号的方式一无所知。具体来说,我正在寻求帮助,用于GatherBy
对包含i
来自对列表的元素的对进行分组cases
。
当我在函数范围之外对其进行测试时,我一直在使用e = GatherBy[cases, MemberQ[#, i] &];
which 工作正常,但是当放入函数模块时,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]
意味着在我所描绘的模型中, nodea
和 node之间存在连接b
。在这个例子中,我想要输出的等价类是 {41,42,43},因为 41 连接到 42,而 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
并不总是将包含值的对作为返回列表中的第一个元素,因此我使用该PositionQ
函数检查两个元素中的哪一个包含与测试值的对)
-形成包含测试值的所有对的并集,然后用对的并集替换所有对
- 对所有可能的值重复此操作,直到cases
包含我上述定义所定义的所有等价类
我的错误显示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. >>
41 是第一个测试的值,因为它在mappedVals[[1]]
其中,而那个长而恶心的集合是我代码中其他地方使用的全局变量。
我认为我的问题在于对函数的调用e = GatherBy[cases, MemberQ[#, i] &];
。我正在尝试搜索包含例如 41 的对cases
的形式。{{42,41},{43,41},{43,42}}
抱歉这么冗长,但我真的很感激任何帮助。