2011-06-30 7 views
0

このネストループを実行しようとしましたが、動作しません。各段階で結果を保存しているわけではありません。しかし、私がlistInitialをPrint []に置き換えると、私はすべての変更が行われたことを観察します。変数を保存していないMathematica

For[b = 1, b < 4, b = b + 1, 
For[a = 1, a < 4, a = a + 1, 
    For[x = 1, x < 4, x = x + 1, 
    For[z = 1, z < 4, z = z + 1, listInitial = 
    If[Random[] > psurvival, 
     ReplacePart[ 
     InitialMatrix[3, 3, 3, 3], {b, a, x, z} -> 
     InitialMatrix[3, 3, 3, 3][[b]][[a]][[x]][[z]] - 1], 
     InitialMatrix[3, 3, 3, 3], {b, a, x, z} -> 
     InitialMatrix[3, 3, 3, 3][[b]][[a]][[x]][[z]]]]]]] 

listInitial // TableForm 

答えて

0

ありがとうございます。私はこの解決策を見つけた: 私はそれがより簡単だと思うし、それは働いている。

SetAttributes[myFunction, Listable] 
myFunction[x_] := 
If[Random[] > psurvival, If [x - 1 < 0 , x , x - 1], x] 
myFunction[InitialMatrix[3, 3, 3, 3]] // TableForm 
+0

を解決するために、このメソッドを使用よろしいですか?それは、あなたがあなたの質問でやったこととは全く異なる何かをします。例えば、あなたはRandom []を64回呼び出し、ここでは1回だけ呼び出します。 –

+0

なぜ1つだけですか?すべてのxについて、関数が呼び出されます。だから私は再び64回呼ばれると思います!私が見つけた結果から少なくとも! – glarkou

+0

これはあなたの新しい機能リストがあなたが暗示していた以前のリスト全体を置き換えたと仮定していました。 –

2

は、私はあなたが私はあなたの問題はあなたがInitialMatrixを変更するReplacePartを期待していることだと思います

In[27]:= A={1 ,2 }; 
A=ReplacePart[A,1->99]; 
A 

Out[29]= {99,2} 
3

にとして、ReplacePartの結果を見るためにinitialMatrixに結果を代入する必要があると思います。それはしません。 InitialMatrixの名前のないコピーが変更され、結果として返され、listInitialに割り当てられます。後者はループの繰り返しごとに新しい値で上書きされるため、最終的にはの最後の文字列がに置換されます。その時点ですべての変数が3に等しい場合、最後の置換は次のようになります。

InitialMatrix[3, 3, 3, 3], {3, 3, 3, 3}->InitialMatrix[3, 3, 3, 3][[3]][[3]][[3]][[3]]] 

効果的に何もしません。最終的な結果は、あなたが始めたものを含むlistInitialです。

編集
私はちょうどあなたのIf文の第2引数が明確にここで不足しているReplacePartの2番目のインスタンスのためにフォーマットされていることを発見し、

3

私はあなたが4倍にするためにネストされた必要があるかどうかを疑問視全くループしないでください。あなたのコードを正しく理解していれば、3 * 3 * 3 * 3のテンソルがあり、ある乱数がある閾値を上回っている場合、各要素の初期値を1減らしたいとします。私は、InitialMatrixが何らかのオブジェクトではなく、正しく定義した関数であると仮定しています。

確かにこれは動作します:テンソルは常にN * N * N * N、その後、あなたは可能性がある場合は、バージョン8では

InitialMatrix[3,3,3,3] + Table[If[RandomReal[]>psurvival,-1,0],{3},{3},{3},{3} ] 

を、あなたは

-RandomVariate[BernoulliDistribution[1-psurvival], {3,3,3,3}] 

Table機能を置き換えることができますが少し機能を書いてください:

decrementInitial[n_Integer?Positive,p_?Positive]/; p<=1. := 
InitialMatrix[n,n,n,n] + Table[If[RandomReal[]>p,-1,0],{n},{n},{n},{n} ] 

あなたが最初の行列を書き直したいのであればいくつかのステップで生存関数を繰り返したいと思うなら、純粋な関数を使ってこのようなものが適しているでしょう(バージョン8用)。

survivalFn[n_Integer?Positive,p_?Positive,steps_Integer?Positive]/; p<=1. := 
Nest[# + RandomVariate[BernoulliDistribution[1-p], {n,n,n,n}]& , 
InitialMatrix[n,n,n,n], steps] 

またはバージョンの前8:あなたは質問は、これはあなたが最終的にやろうとしていたものだったことを私に示唆し頼ま方法について

survivalFn[n_Integer?Positive,p_?Positive,steps_Integer?Positive]/; p<=1. := 
Nest[# - Table[If[RandomReal[]>p,-1,0],{n},{n},{n},{n} ]& , 
InitialMatrix[n,n,n,n], steps] 

何か。

user825366

からのリクエストに応じて追加の材料私はあなたの機能について知っているけどさんは、いくつかのことを経るようにしたい正確に何か分かりません。最初にBernoulliDistribution機能。 documentationは言う:

ベルヌーイ分布は確率pで値x = 1を、確率1-pでx = 0を与えます。

あなたは確率確率1-psurvivalpsurvivalと-1と0をしたいので、基本的にあなたは-BernoulliDistribution[1-psurvival]を持っています。

次に、Nest関数(documentationを参照)。これは何らかの関数をとり、開始値(この場合はInitialMatrix[3,3,3,3])に適用し、最初の反復の結果が何であっても再び適用し、適切なステップ数を反復します。

ネストされる関数の定義内では、の純関数を使用するのが一般的です。ドキュメントにはthis guidethis one tooと記載されています。

私は役立つことを願っています。

0

私はこの

InitialTable[x_, y_, z_, w_] := 

    MapAt[g, 
    ReplacePart[ 
    InitialMatrix[x, y, z, w] + 
    ReplacePart[ 
     Table[If[RandomReal[] > psurvival2, -1, 0], {x}, {y}, {z}, {w}], 
    {{_, _, 1, _} -> 0, {_, _, 2, _} -> 0}], 
    {{_, _, 1, 2} -> 0, {_, _, 1, 3} -> 0}], 
    Flatten[Table[{i, j, k, l}, {i, x}, {j, y}, {k, z}, {l, w}], 3]]; 

g[x_] := If[x < 0, 0, x]; 
関連する問題