首页 > 试题广场 >

实现简化行阶梯形(RREF)函数

[编程题]实现简化行阶梯形(RREF)函数
  • 热度指数:216 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现一个函数,将给定矩阵转换为简化行阶梯形(Reduced Row Echelon Form, RREF)。
RREF是一种特殊的矩阵形式,具有以下特点:
1. 每行的首个非零元素(主元)为1
2. 主元所在列的其他元素都为0
3. 每行主元右侧的零行都在非零行之下

输入描述:
函数`rref`接收一个参数:
- matrix:numpy数组表示的矩阵


输出描述:
返回对应的简化行阶梯形,类型为numpy数组。
示例1

输入

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

输出

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

备注:
1.对应的输入、输出已给出,您只用实现核心功能函数即可。
2.支持numpy、scipy、pandas、scikit-learn库。
import numpy as np

def rref(matrix):
    A = matrix.astype(np.float32)
    rows, cols = A.shape

    for i in range(rows):
        # 1. 把当前leading entry A[i,i],变成1
        if A[i, i] == 0: # 如果当前主元为0 
            nonzero_id = np.nonzero(A[i:, i])[0]
            if len(nonzero_id) == 0: continue
            # 把后续行的非零元素,挪上来
            A[i] = A[i] + A[nonzero_id[0] + i]
        A[i] = A[i] / A[i, i]

        # 2. 把当前leading entry A[i, i]所在列i的其他元素都变成0
        for j in range(rows):
            if j != i: # 其他行
                A[j] -= A[j, i] * A[i] # A[i,i] = 1, 所以 A[j,i] 减完后为0
    return A


if __name__ == "__main__":
    print(rref(np.array(eval(input()))))

发表于 2025-06-09 10:44:58 回复(0)