首页 > 解决方案 > 如何将非矢量化 for 循环转换为矢量化格式?

问题描述

我正在尝试将for 循环(如下)转换为矢量化格式,以提高计算速度。

a1、b1 和 c1 的值都是常数。

如何将 for 循环转换为矢量化格式?

笔记:

  1. 虽然我知道将 for 循环转换为矢量化格式会提高效率,但我希望通过更改 while 和 for 循环来进一步提高速度

  2. 我将不胜感激任何可以提供将非矢量化代码转换为矢量化的背景的阅读材料(或其他资源)

     T = np.zeros((int(time/dt)+2, N+1)) #setting up Temperature - Position array
    
     n = 0 #setting position equal to 0 (initial position)
     # Initial Condition
     T[n, :] = T0 #setting T = T0 at t=0 for all positions (initial temperature array)
     # Boundary Condition
     T[:, 0] =  T_in #setting all times at n=0 to inlet fluid temperature
    
     while t <= time: #running simulation until required simulation time
         for i in range(1,N): #solving for temperature at every increment
             T[n+1,i] = T[n,i] + a1*T[n,i+1] - b1*T[n,i] + c1*T[n,i-1] #using three nodes (i-1,i,i+1) at time n to solve for 
                                                                       #temperature at n+1, position i
    
         T[n+1,-1]  = T[n+1,-2] #setting final position temperature equal to second last temperature
         T[n+1, 0] =  T_in #resetting position 0 as inlet fluid temperature
         n = n + 1 #incrementing position
         t = t + dt #incrementing time
    

标签: pythonvectorization

解决方案


你可以试试这个:

T = np.empty((int(time / dt), N + 1))  #setting up Temperature - Position array

# Initial Condition
T[0, :] = T0  
# Boundary Condition
T[:, 0] = T_in

for n in range(0, T.shape[0] - 1):
    T[n + 1, 1:N] = c1 * T[n, :N - 1] + (1 - b1) * T[n, 1:N] + a1 * T[n, 2:]
    T[n + 1, -1] = T[n + 1, -2]

不需要while循环。数组的行数T是以这样的方式选择的,t <= time当你遍历这个数组的所有行时,条件将得到满足。我没有看到避免剩余for循环的简单方法,因为您正在递归地计算每一行。


推荐阅读