2016-08-30 3 views
1

マイのMathematica(バージョン10.4および新しい11の両方)は、次のループでクラッシュのためにクラッシュ:Mathematicaはループ

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であり、このコードは、隣接して接続されたすべてのノードを見つけることですマトリックス。

興味深いことに、このコードは約14000個の "カウント"(変数数)まで非常によく機能し、その後Mathematicaはクラッシュします。

$ RecursionLimitがInfinityに設定されています。

ありがとうございました。また、コードに関する他の提案も高く評価されています。

+0

私のマシンで問題を再現することはできません。コードを編集して簡単な例の入力と出力を表示してください。ここには疎な配列があります: 'adjmatrix = SparseArray [{{i_、i_} - > 12、{i_、j_} /; @Michael Gwerder –

+0

文書で「実行」よりも優れたパフォーマンスを持つ「Do」を検索することができます。 'Table'と' ParallelTable' –

+0

あなたは 'connectedNodes'に値を割り当てていません@Michael Gwerder –

答えて

0

変数$ RecursionLimitを無限に設定しても、すべてのプログラミング言語はそれほど多く回帰することができます。私が正しく仮定できるとすれば、Mathematicaコンパイラは現在のローカル "スタックメモリ"がスタックメモリの最大サイズをオーバーフロー(または超過)したときに発生する "スタックオーバーフロー"エラーを投げています。

私が推測していることに基づいて、前回の再帰から作成された不要な変数参照を破壊するために、各再帰の終わりに強制的に/手動でMathematicaガベージコレクタを初期化することをお勧めします。ループがクラッシュしたときに表示されるエラーメッセージを表示できる場合は、私または他の人があなたにもっと建設的な応答をさせることができます。

+0

あなたの答えをありがとう、私はガベージコレクターを見てみましょう。エラーメッセージについて:残念ながら、何もありません。ちょうどウィンドウのエラー音とすべてのカーネルの種類の "再起動"(すべてのデータが失われますが、カーネルはエバリュエーション用にバックアップされています) –

0

ご協力いただきありがとうございます。

解決策は、見つかった新しいノードを中間変数に追加して、その変数にループすることでした。そのようにして、私はループに「深く」行くことはなく、常に1つのレベルに留まりました。

誰かが同じ(または同じ)問題を抱えている場合は、コード全体を記述します。しかし、今のところ私は "テキスト版"が自明であることを願っています。