wolfram-mathematica - 如何加快 Mathematica 替换矩阵元素

标签 wolfram-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  

最佳答案

这个怎么样:

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/

相关文章:

wolfram-mathematica - 如何修改OUTPUT字体类型?

Matlab 或 Mathematica : Need help in computing the Pdf for sum of unknown named distribution and normal random variable

python - Mathematica 到 Python/C 代码

wolfram-mathematica - 推导张量内值的均值

math - 在Mathematica中绘制量子谐波振荡器

formatting - 从 Mathematica 导出自定义格式的表达式

wolfram-mathematica - 如何在具有不透明度的 FillingStyle 中添加自定义 ColorFunction

wolfram-mathematica - 数学: Changing the options of a Graphics object

linux - 在 Xvfb 而不是正常 X 下生成的图像具有 fubar 调色板

pattern-matching - Mathematica 中使用模式匹配的填字游戏