我正在尝试编写一个脚本,将矩阵置于缩减的行梯队形式,但是我的脚本(以及我在互联网上找到的其他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]]