循环不会在if-else循环中进入else部分

时间:2019-08-28 18:04:42

标签: python numpy

问题:

我有一个3 * 3转换矩阵和另一个3 * 1矩阵。将这两个数相乘,我得到另一个3 * 1矩阵。我必须将新的3 * 1矩阵与原始3 * 3矩阵相乘,这将给我另一个3 * 1矩阵。这必须继续直到连续步骤中获得的3 * 1矩阵足够接近,或者如果完成10000个这样的乘法(以先到者为准)。要查看它们是否足够接近,我有一个功能:

np.allclose(previous_x,new_x)#确定此过程是否必须继续或停止。

previous_x表示先前的3 * 1矩阵,而new_x表示当前的新3 * 1矩阵。

max_steps = 10000

下面的代码中的'res'肯定会在10k步用完之前的某个时候变成'True',以进入else循环。但是由于某种原因,它没有发生。你能帮我解决这个问题吗?

[代码]

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)

2 个答案:

答案 0 :(得分:0)

您的乘法

P= np.array([[0,1,0.5],[1,0,0],[0,0,0.5]])
x_0= np.array([1,0,0])
x= np.dot(P,x_0)

产量:

np.array([0., 1., 0.])

因此np.allclose(x, x_0)将返回False,并且永远不会执行else分支,因为可以更改res的唯一位置是在循环之前和else中分支(只有在循环之前的函数调用求值为res== True时才能到达。

顺便说一句:尝试避免使用== True/False比较布尔值。宁可使用is True/False。如果您想了解更多有关此内容的信息,请read this post

答案 1 :(得分:0)

我认为jottbe的回答暗示了这一点,但它可能更明确:

您的代码被卡在protected void btnSort_Click(object sender, EventArgs e) { DataTable dtResult = new DataTable(); DataView sortOrder = dtResult.DefaultView; //sortOrder.Sort = "LINK_CODE, BUDGET_ID, UPLOADED DESC"; -> these parameters to be replaced by values of dropdowns in the gvSort gridview. if (ddl_ddlField.SelectedValue == "MenuGroup") sortOrder.Sort = "Menu_Group, Item_Name ASC"; else if (ddl_ddlField.SelectedValue == "BUDGET_ID") sortOrder.Sort = "Item_BUDGET_ID, Menu_Group ASC"; else if (ddl_ddlField.SelectedValue == "UPLOADED DESC") sortOrder.Sort = "Item_UPLOADED DESC, Item_Name ASC"; else if (ddl_ddlField.SelectedValue == "Quantity") sortOrder.Sort = "Item_Quantity, Item_Name ASC"; else if (ddl_ddlField.SelectedValue =="MenuGroup") sortOrder.Sort = "Menu_Group, Item_Name ASC"; gvSort.DataSource = sortOrder; gvSort.DataBind(); } / if的第一分支中,因为一旦进入,它就永远不会重新计算else。因此,如果res曾经是res,它将一直保持False(并且您将继续使用第一个分支),直到达到循环限制为止。

要解决该问题,您可能需要在循环的每次迭代中重新计算False。我不太了解您使用单独的res函数在做什么,但也许您每次都需要打电话。如果发现乘法没有明显改变,您可能需要做的matrix_mult更像if,以便尽早退出循环。其他一切都应该无条件地在每次迭代中发生。