我的Mathematica (版本10.4和新版本11)在以下循环中崩溃:
count = 0;
findConnectedNodes[start_] := Module[{positions, i},
count++;
positions = adjmatrix[[start]] // ArrayRules // Keys;
positions = positions[[1 ;; -2]] // Flatten;
For[i = 1, i <= Length[positions], i++,
If[Not[MemberQ[connectedNodes, positions[[i]]]],
findConnectedNodes[positions[[i]]]];
AppendTo[connectedNodes, positions[[i]]];
connectedNodes = connectedNodes // DeleteDuplicates;
]
];
findConnectedAddresses[1];
变量an是一个矩阵,此代码用于查找邻接矩阵中的所有连接节点。
有趣的是,代码在大约14'000个“计数”(变量count)的情况下工作得非常好,在此之后Mathematica就崩溃了。
$RecursionLimit设置为无穷大。
非常感谢你的帮助。此外,对于代码的任何其他建议也是非常感谢的。
发布于 2016-08-30 21:20:51
尽管您将变量$RecursionLimit设置为无穷大,但所有编程语言都只能递归到无穷大为止。如果我可以正确地假设Mathematica编译器抛出了一个"Stack Overflow“错误,当当前的本地”堆栈内存“溢出(或超过)最大堆栈内存大小时,就会发生这种错误。
根据我的推断,我建议在每次递归结束时强制/手动初始化Mathematica垃圾收集器,以销毁从以前的递归中创建的不需要的变量引用。如果您可以提供循环崩溃时给出的错误消息,我或其他人将能够为您提供更具建设性或接地的响应。
发布于 2016-09-04 13:58:28
非常感谢你的所有提示和想法。
我的解决方案是将找到的新节点添加到中间变量中,并对该变量进行循环。这样,我就不会“深入”循环,总是停留在一个层次上。
如果任何人有类似(或相同)的问题,我将编写整个代码。但现在,我希望“文本版本”是不言自明的。
https://stackoverflow.com/questions/39236772
复制相似问题