0

我对 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}}

抱歉这么冗长,但我真的很感激任何帮助。

4

0 回答 0