我试图避免使用for循环来运行我的计算。但我不知道该怎么做。我有一个形状为w
的矩阵(40,100)
。每一行在t
时间内保持波形的位置。例如,第一行w[0]
是初始条件(由于我将展示的原因,也是w[1]
。)
要为形状范围内的每个t
和x
计算我使用的下一行元素:
w[t+1,x] = a * w[t,x] + b * ( w[t,x-1] + w[t,x+1] ) - w[t-1,x]
a
和b
是基于等式解的一些常数(它确实无关紧要),a = 2(1-r)
,b=r
,r=(c*(dt/dx))**2
。如果c
是波速且dt
,则dx
与x
和t
方向的增量相关。
有没有办法避免像for循环那样:
for t in range(1,nt-1):
for x in range(1,nx-1):
w[t+1,x] = a * w[t,x] + b * ( w[t,x-1] + w[t,x+1] ) - w[t-1,x]
nt
和nx
是w
矩阵的形状。
答案 0 :(得分:5)
我假设您事先设置w[:,0]
和w[:-1]
(对某些常量?)因为我没有在循环中看到它。
如果是这样,你可以消除for x
循环向量化这部分代码:
for t in range(1,nt-1):
w[t+1,1:-1] = a*w[t,1:-1] + b*(w[t,:-2] + w[t,2:]) - w[t-1,1:-1]
答案 1 :(得分:0)
不是真的。如果你想为矩阵中的每个元素(你做的)做一些事情,那么你将不得不以某种方式对每个元素进行操作(最明显的方法是使用for循环。不太明显的方法将会无论是相同还是更差)。
如果您因为循环缓慢而试图避免循环,请知道有时循环必需来解决某种问题。但是,有很多方法可以使循环更有效。
一般情况下,如果您正在查看相邻元素的矩阵问题,一个好的解决方案是使用某种动态编程或记忆(保存您的工作,这样您就不必经常重复计算) 。比如,假设您想要获取每个元素的平均值以及它周围的所有内容(这就是模糊图像的工作原理)。每个像素有8个邻居,所以平均值将是和/ 9.嗯,让我们说你保存列的总和(保存NW + W + SW,N + me + S,NE + E + SE )。那么当你转到右边的下一个时,只需将前一个中间列的值,前一个最后一列和新列的值(右边的新值)相加。您刚刚更换了添加9个数字并添加了5个。在比添加更复杂的操作中,减少9到5可能意味着性能的巨大提升。
我看着你要做的事情,我无法想出一个像我刚才描述的那样做的好方法。但看看你是否能想到类似的东西。
另外,记住乘法比加法要贵得多。因此,如果你有一个循环,例如,你必须将一些数字乘以循环变量,而不是做1x,2x,3x,......,你可以这样做(值上次+ x)。