私はあなたが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-psurvival
とpsurvival
と-1と0をしたいので、基本的にあなたは-BernoulliDistribution[1-psurvival]
を持っています。
次に、Nest
関数(documentationを参照)。これは何らかの関数をとり、開始値(この場合はInitialMatrix[3,3,3,3]
)に適用し、最初の反復の結果が何であっても再び適用し、適切なステップ数を反復します。
ネストされる関数の定義内では、の純関数を使用するのが一般的です。ドキュメントにはthis guide、this one tooと記載されています。
私は役立つことを願っています。
を解決するために、このメソッドを使用よろしいですか?それは、あなたがあなたの質問でやったこととは全く異なる何かをします。例えば、あなたはRandom []を64回呼び出し、ここでは1回だけ呼び出します。 –
なぜ1つだけですか?すべてのxについて、関数が呼び出されます。だから私は再び64回呼ばれると思います!私が見つけた結果から少なくとも! – glarkou
これはあなたの新しい機能リストがあなたが暗示していた以前のリスト全体を置き換えたと仮定していました。 –