【问题标题】:Reduced Row Echelon form script doesn't work in specific cases缩减行梯队表单脚本在特定情况下不起作用
【发布时间】:2019-06-10 19:28:53
【问题描述】:

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

【问题讨论】:

    标签: python numpy matrix linear-algebra


    【解决方案1】:

    您的行没有正确交换。

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

    结果

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

    正确的交换方式是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多