检查Python条件循环中的非对角线条目

时间:2016-02-11 08:53:18

标签: python loops if-statement

我试图实现QR算法来找到矩阵的一些特征值,但我在Python中将循环放在一起时遇到了一些麻烦。

基本上,我有一个带有非对角线条目的正方形可逆矩阵A,每次我通过循环时,我想检查这些非对角线条目是否低于某个设定精度(例如1 ^ -6) )。如果是,我想停下来给出结果矩阵。以下是我到目前为止的情况:

accuracy=1^-6
V=numpy.identity(4)
for x in xrange(100): 
    while i != j:
        if A[i][j]>accuracy:
            Q,R=numpy.linalg.qr(A)
            A=numpy.dot(R,Q)
            numpy.dot(V,Q)
        else:
            print "Off-diag entries below accuracy value"
            print A

但我的代码不起作用。它说我还没有定义,但是我不确定我将它定义为什么,因为它应该是矩阵A的行条目。我想我只是坚持这个环。

修改:

好的,我摆脱了while循环,因为它让事情变得混乱。 现在我拥有的是:

accuracy=1^-8
V=numpy.identity(4)
for i in xrange(0,4):
    for j in xrange(0,4):
            if A[i,j]>accuracy:
        Q,R=numpy.linalg.qr(A)
        print "This is Q:",Q
        print "This is R: ",R
        A=numpy.dot(R,Q)
        print "This is the new A where A=RQ:",A
            numpy.dot(V,Q)
            else:
                print "Stopped"

print "This is A now:"
print A

这是我得到的A:

This is A now:
[[  9.77769257e+00   0.00000000e+00   3.22862690e-08   0.00000000e+00]
 [  0.00000000e+00   1.00578866e+01   0.00000000e+00   1.20385489e-04]
 [  3.22862677e-08   0.00000000e+00   7.22307431e-01   0.00000000e+00]
 [  0.00000000e+00   1.20385489e-04   0.00000000e+00   2.44211345e+00]]

我应该得到的是对角矩阵,对角线上有特征值。在上面编辑的代码中,我省略了对非对角元素的检查,因为我不确定如何去做。但基本上,它应该检查不在对角线上的元素是否小于上面给出的精度常数。如果是,那么循环应该完成。如果没有,它应该继续前进,直到非对角元素真的那么小。这都是近似得到对角矩阵。

1 个答案:

答案 0 :(得分:1)

在内循环中使用它们之前未定义

ij,并且它们的值不会更改。

另一方面,外部循环中不使用x

我不确定你要做的是什么,以及你是否需要这两个循环。但也许你想要这样的东西:

accuracy=1^-6
V=numpy.identity(4)
for i in xrange(4):
    for j in xrange(4):
        if i != j:
            if A[i][j]>accuracy:
                Q,R=numpy.linalg.qr(A)
                A=numpy.dot(R,Q)
                numpy.dot(V,Q)
            else:
                print "Off-diag entries below accuracy value"
                print A

更新:固定而我!= j如果我!= j