缩减行梯队表单脚本在特定情况下不起作用



我正在尝试编写一个脚本,将矩阵置于缩减的行梯队形式,但是我的脚本(以及我在互联网上找到的其他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 代码,因为我稍后需要跟踪在原始矩阵上执行的行交换/操作。

您的行未正确交换。

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

结果在

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

正确的交换方式是

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

最新更新