如何将非矢量化 for 循环转换为矢量化格式?
How to convert non-vectorized for loop to vectorized format?
我正在尝试将 for 循环(如下)转换为矢量化格式,目的是提高计算速度。
a1,b1,c1的值都是常量。
如何将 for 循环转换为矢量化格式?
注:
虽然我知道将 for 循环转换为矢量化格式会提高效率,但我希望通过更改 while 和 for 循环进一步提高速度的指示
如果阅读 material(或其他资源)可以提供将非矢量化代码转换为矢量化代码的背景知识,我将不胜感激
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
你可以试试这个:
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
循环的简单方法,因为您正在递归计算每一行。
我正在尝试将 for 循环(如下)转换为矢量化格式,目的是提高计算速度。
a1,b1,c1的值都是常量。
如何将 for 循环转换为矢量化格式?
注:
虽然我知道将 for 循环转换为矢量化格式会提高效率,但我希望通过更改 while 和 for 循环进一步提高速度的指示
如果阅读 material(或其他资源)可以提供将非矢量化代码转换为矢量化代码的背景知识,我将不胜感激
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
你可以试试这个:
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
循环的简单方法,因为您正在递归计算每一行。