Я спрашиваю, нужен ли вам четырехкратный вложенный цикл For. Если я правильно понимаю ваш код, у вас есть тензор 3 * 3 * 3 * 3, и вы хотите уменьшить начальное значение каждого элемента на 1, если какое-то случайное число превышает некоторый порог. Я предполагаю, что InitialMatrix
- это функция, которую вы уже правильно определили, а не какой-то объект.
Конечно, это будет работать:
InitialMatrix[3,3,3,3] + Table[If[RandomReal[]>psurvival,-1,0],{3},{3},{3},{3} ]
В версии 8 вы можете заменить функцию Table
на
-RandomVariate[BernoulliDistribution[1-psurvival], {3,3,3,3}]
Если тензор всегда равен n * n * n * n, вы можете написать небольшую функцию:
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]
Что-то в том, как вы задали вопрос, подсказывало мне, что именно это вы и пытались сделать в конечном итоге.
Дополнительные материалы по запросу от пользователя 825366
Я не уверен, что именно вы хотите знать о функции, но давайте рассмотрим несколько вещей. Сначала функция BernoulliDistribution
. документация гласит:
Распределение Бернулли дает значение x = 1 с вероятностью p и x = 0 с вероятностью 1-p.
Вы хотите 0 с вероятностью psurvival
и -1 с вероятностью 1-psurvival
, так что по сути у вас есть -BernoulliDistribution[1-psurvival]
.
Далее функция Nest
(см. документация ). Это берет некоторую функцию, применяет ее к начальному значению (в данном случае InitialMatrix[3,3,3,3]
), затем применяет ее снова к тому, что было результатом этой первой итерации, и повторяет для соответствующего количества шагов.
В определении вложенной функции обычно используется чистых функций . Вы должны прочитать это руководство в документации и это тоже .
Надеюсь, это поможет.