精简行梯队表格脚本在特定情况下不起作用

时间:2019-06-10 19:28:53

标签: python numpy matrix linear-algebra

我正在尝试编写一个脚本,以简化的行梯形形式放置矩阵,但是在某些情况下,我的脚本(以及我在互联网上找到的其他python脚本)似乎失败了。

例如,我的脚本在以下矩阵上产生正确的结果:

In: [[-1  1]
     [-1  2]
     [-3  2]]

Out: [[1. 0.]
      [0. 1.]
      [0. 0.]]



In:  [[-1  1  0  1]
      [-2 -3 -1 -2]
      [-3 -1 -2 -1]]

Out: [[ 1.         0.          0.         -0.33333333]
     [ 0.          1.          0.          0.66666667]
     [-0.         -0.          1.          0.66666667]]

但是在诸如此类的矩阵上失败:

In: [[ 0 -3  1 -1]
     [-2  1  0  3]]



 Out: [[ 1.  -0.5 -0.  -1.5]
       [ 0.   0.   0.   0. ]]

正确答案应该在哪里:

[[ 1. 0. -0.16666, -1.33333
 [ 0. 1. -0.33333, 0.33333 ]]

rref的代码如下:

import numpy as np

def rref(M):
        lead = 0
        rowCount = len(M)
        columnCount = len(M[0])
        for r in range(rowCount):
                if lead >= columnCount:
                        return
                i = r
                while (M[i][lead] == 0):
                        i += 1
                        if (i == rowCount):
                                i = r
                                lead += 1
                                if (columnCount == lead):
                                        return
                M[r],M[i] = M[i],M[r]

                if (M[r][lead] != 0):
                        M[r] = M[r]/M[r][lead]
                for i in range (rowCount):
                        if (i != r):
                                M[i] = M[i] - M[i][lead]*M[r]
                lead += 1

a = np.array([[0,-3,1,-1],[-2,1,0,3]])

#prints original matrix
print(a)

#ARRAY MUST BE FLOATS FOR RREF FUNCTION

a = a.astype(np.float)
rref(a)

#prints rref matrix
print(a)

此代码是对https://rosettacode.org/wiki/Reduced_row_echelon_form#Python

上同样无法使用的代码的改进。

我知道sympy具有内置的rref函数,并且我知道如何使用它,但是我需要实现自己的rref代码,因为以后需要跟踪对原始行执行的行交换/操作。矩阵。

1 个答案:

答案 0 :(得分:1)

您的行未正确交换。

M[r],M[i] = M[i],M[r]

结果

[-2.  1.  0.  3.]
[-2.  1.  0.  3.]

正确的交换方式是

M[[r,i]] = M[[i,r]]