问题:
我有一个3*3的转移矩阵和另一个3*1矩阵。把这两个相乘,我得到另一个3*1矩阵。我必须将新的3*1矩阵与原始的3*3矩阵相乘,这将得到另一个3*1矩阵。这必须持续,直到连续步骤中获得的3*1矩阵足够接近,或者如果完成10000次此类乘法(以先到者为准)。要查看它们是否足够接近,我有一个函数:
np.allclose(上一个,新的)#确定此过程是否必须继续或停止
previous_x表示之前的3*1矩阵,new_x表示当前的新3*1矩阵
最大步数=10000
为了进入else循环,下面代码中的“res”肯定会在10k步数结束之前的某个时间点变为“True”。但由于某些原因,它不会发生。你能帮我解决这个问题吗
[守则]
def random_walk(P,x_0,max_steps = 10000):
n_steps = 0
def matrix_mult(P,x_0,n_steps):
x = np.dot(P,x_0)
res = np.allclose(x_0,x)
n_steps = n_steps+1
return x,res,n_steps
x,res,n_steps = matrix_mult(P,x_0,n_steps)
print(res)
for i in range(max_steps-1):
if(res==False):
print('h')
x_0 = x
x=np.dot(P,x_0)
else:
print('g')
x_0 = x
x,res,n_steps = matrix_mult(P,x_0,n_steps)
n_steps =i
return x, n_steps
random_walk(np.array([[0,1,0.5],[1,0,0],[0,0,0.5]]),np.array([1,0,0]),max_steps = 10000)
我认为约特比的回答暗示了这一点,但可以更明确地说:
您的代码卡在
if
/else
的第一个分支中,因为一旦它进入,它就不会重新计算res
。因此,如果res
是False
,它将始终保持False
(并且您将继续执行第一个分支),直到达到循环限制要解决这个问题,您可能需要在循环的每个迭代中重新计算
res
。我真的不明白你在用单独的matrix_mult
函数做什么,但也许你需要每次都调用它。如果您发现乘法没有显著改变任何东西,那么您可能需要做的if
更像是if res: break
提前退出循环。其他一切都应该无条件地在每次迭代中发生你的乘法运算
收益率:
因此
np.allclose(x, x_0)
将返回False
,并且else
分支永远不会执行,因为唯一可以更改res的位置是在循环之前和else
分支中(只有在循环之前的函数调用求值为res== True
时才能访问)顺便说一句:尽量避免使用
== True/False
比较布尔值。而是使用is True/False
。如果您想了解更多关于此的信息,请read this post相关问题 更多 >
编程相关推荐