Mathematica 在 for 循环中崩溃
Mathematica crashes in for loop
我的 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];
变量 adjmatrix 是一个 SparseArray,此代码用于查找邻接矩阵中的所有连接节点。
有趣的是,代码在大约 14'000 "counts"(变量计数)之前运行良好,之后 Mathematica 就崩溃了。
$RecursionLimit 设置为 Infinity。
非常感谢您的帮助。也非常感谢对代码的任何其他建议。
尽管您将变量 $RecursionLimit 设置为无穷大,但所有编程语言都只能递归到这么多。如果我能正确假设 Mathematica 编译器会向您抛出一个 "Stack Overflow" 错误,当当前本地 "stack memory" 溢出(或超过)最大堆栈内存大小时就会发生这种错误。
根据我的推断,我建议 force/manually 在每次递归结束时初始化 Mathematica 垃圾收集器,以销毁从先前递归创建的不需要的变量引用。如果您能提供循环崩溃时给出的错误消息,我或其他人将能够为您提供更有建设性或更扎实的回应。
非常感谢您提供的所有提示和想法。
我的解决方案是将找到的新节点添加到中间变量并在该变量上循环。这样我就没有进入 "deeper" 循环并始终保持在一个级别。
如果有人有类似(或相同)的问题,我会写完整的代码。但现在我希望 "text-version" 是不言自明的。
我的 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];
变量 adjmatrix 是一个 SparseArray,此代码用于查找邻接矩阵中的所有连接节点。
有趣的是,代码在大约 14'000 "counts"(变量计数)之前运行良好,之后 Mathematica 就崩溃了。
$RecursionLimit 设置为 Infinity。
非常感谢您的帮助。也非常感谢对代码的任何其他建议。
尽管您将变量 $RecursionLimit 设置为无穷大,但所有编程语言都只能递归到这么多。如果我能正确假设 Mathematica 编译器会向您抛出一个 "Stack Overflow" 错误,当当前本地 "stack memory" 溢出(或超过)最大堆栈内存大小时就会发生这种错误。
根据我的推断,我建议 force/manually 在每次递归结束时初始化 Mathematica 垃圾收集器,以销毁从先前递归创建的不需要的变量引用。如果您能提供循环崩溃时给出的错误消息,我或其他人将能够为您提供更有建设性或更扎实的回应。
非常感谢您提供的所有提示和想法。
我的解决方案是将找到的新节点添加到中间变量并在该变量上循环。这样我就没有进入 "deeper" 循环并始终保持在一个级别。
如果有人有类似(或相同)的问题,我会写完整的代码。但现在我希望 "text-version" 是不言自明的。