У меня есть несколько матриц 100x15; один из них - это расстояние. Когда элементы этой матрицы превышают границу, я хочу, чтобы reset эти элементы равны нулю, а также reset соответствующие элементы трех других матриц равны нулю. Вот мой глупый способ (но он работает):
Do[ If[ xnow[[i, j]] > L, xnow[[i, j]] = 0.;
cellactvA[[i, j ]] = 0.;
cellactvB[[i, j ]] = 0.;
cellactvC[[i, j ]] = 0.; ], (* endIF *)
{ i, 1, nstrips}, {j, 1, ncells} ]; (* endDO *)
Я попробовал ReplacePart
:
xnow = ReplacePart[ xnow, Position[ xnow, x_?(# > L &) ] ]
(что-то вроде этого, у меня его нет, это было сделано достаточно правильно для выполнения), но он был медленным, как цикл, и не создал правильную структуру замещения в матрице xnow. Пожалуйста, сообщите, как это сделать достаточно быстро, так как этот калькулятор находится внутри другого цикла (с течением времени), который выполняется много раз. Общий расчет, конечно, сейчас очень медленный. Спасибо заранее.
Вот как я сделал это в R; очень просто и быстро:
# -- find indices of cells outside window
indxoutRW <- which( xnow > L, arr.ind=T )
# -- reset cells outside window
cellrateA[indxoutRW] <- 0
cellrateB[indxoutRW] <- 0
cellrateC[indxoutRW] <- 0
# -- move reset cells back to left side
xnow[indxoutRW] <- xnow[indxoutRW] - L