Как ускорить замену элементов матрицы в Mathematica

У меня есть несколько матриц 100x15; одна из них - расстояние. Когда элементы этой матрицы превышают границу, я хочу обнулить эти элементы, а также обнулить соответствующие элементы трех других матриц. Вот мой глупый способ (но он работает):

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  
10
задан bill 4 January 2012 в 04:41
поделиться