我有几个 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
最佳答案
这个怎么样:
Timing[
matrixMask2 = UnitStep[limit - $xnow];
xnow = $xnow*matrixMask2;
cellactvA2 = $a*matrixMask2;
cellactvB2 = $b*matrixMask2;
cellactvC2 = $c*matrixMask2;
]
如果您想编写快速代码,请确保检查 On["Packing"] 不提供消息;或者至少你理解它们并且知道它们不是问题。
编辑 OP 评论:
mask = UnitStep[limit - xnow];
{xnow*mask, cellactvA2*mask, cellactvB2*mask, cellactvC2*mask}
希望这会有所帮助,您仍然需要设置限制。
关于wolfram-mathematica - 如何加快 Mathematica 替换矩阵元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8721866/