gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:42:29 25 4
gpt4 key购买 nike

我有几个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com