我正在尝试编写一个脚本,以简化的行梯形形式放置矩阵,但是在某些情况下,我的脚本(以及我在互联网上找到的其他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代码,因为以后需要跟踪对原始行执行的行交换/操作。矩阵。
答案 0 :(得分:1)
您的行未正确交换。
M[r],M[i] = M[i],M[r]
结果
[-2. 1. 0. 3.]
[-2. 1. 0. 3.]
正确的交换方式是
M[[r,i]] = M[[i,r]]