【问题标题】:Python - Get steps needed to convert matrix to RREFPython - 获取将矩阵转换为 RREF 所需的步骤
【发布时间】:2016-05-30 19:19:35
【问题描述】:

我有以下问题:

我有两个二进制矩阵,可能看起来像这样:

    | 1 | 0 | 1 | 0 | 0 | 1 |       | 1 | 0 | 0 | 0 | 0 | 0 |
    | 0 | 1 | 1 | 1 | 0 | 1 |       | 0 | 1 | 0 | 0 | 0 | 0 |
a = | 0 | 0 | 0 | 1 | 1 | 0 |   b = | 0 | 0 | 1 | 0 | 0 | 0 |
    | 1 | 0 | 0 | 0 | 0 | 1 |       | 0 | 0 | 0 | 1 | 0 | 0 |
    | 0 | 0 | 0 | 1 | 0 | 0 |       | 0 | 0 | 0 | 0 | 1 | 0 |
    | 1 | 0 | 1 | 0 | 0 | 1 |       | 0 | 0 | 0 | 0 | 0 | 1 |

现在我想找到矩阵 a 的行梯形(不一定是简化的行梯形),然后对矩阵 b 应用相同的矩阵运算,这将导致如下结果:

    | 1 | 0 | 1 | 0 | 0 | 1 |       | 1 | 0 | 0 | 0 | 0 | 0 |
    | 0 | 1 | 1 | 1 | 0 | 1 |       | 0 | 1 | 0 | 0 | 0 | 0 |
a = | 0 | 0 | 1 | 0 | 0 | 0 |   b = | 1 | 0 | 0 | 1 | 0 | 0 |
    | 0 | 0 | 0 | 1 | 1 | 0 |       | 0 | 0 | 1 | 0 | 0 | 0 |
    | 0 | 0 | 0 | 0 | 1 | 0 |       | 0 | 0 | 1 | 0 | 1 | 0 |
    | 0 | 0 | 0 | 0 | 0 | 0 |       | 1 | 0 | 1 | 0 | 1 | 1 |

使用 numpy 将第一个矩阵转换为 rref 效果很好,除了我无法知道执行了哪些行操作,因此我无法对第二个矩阵应用相同的操作。

现在这只是一个示例,但实际矩阵将是 50.000x50.000 或更大,不一定是正方形。我尝试实施自己的解决方案,但它太慢了。 有没有什么东西可以做我想做的事,还是我必须尝试优化自己的解决方案?

感谢您的帮助

/莫腾

【问题讨论】:

标签: python numpy matrix scipy linear-algebra


【解决方案1】:

水平连接您的矩阵c = np.c_[a,b] 并在该矩阵上使用rref,这样您就不需要存储中间矩阵。

请注意,rref 在计算上是无用的,除非是非常非常非常特殊的场合。因此,如果必须,请首选 LU 分解。

【讨论】:

    【解决方案2】:

    原来有点乱,但是有解决办法。 scipy.linalg.qrhttps://en.wikipedia.org/wiki/QR_decomposition http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.qr.html#scipy.linalg.qr

    import scipy.linalg as la
    matrix = [[randint(2) for k in range(4)] for j in range(5)]
    (q, r) = la.qr(matrix)
    

    矩阵:

    [[1, 1, 1, 1], [0, 1, 1, 1], [0, 0, 0, 1], [1, 1, 1, 1], [1, 0, 0, 1]]
    

    r:

    array([[-1.73205081, -1.15470054, -1.15470054, -1.73205081],
           [ 0.        , -1.29099445, -1.29099445, -0.77459667],
           [ 0.        ,  0.        ,  0.        ,  1.        ],
           [ 0.        ,  0.        ,  0.        ,  0.63245553],
           [ 0.        ,  0.        ,  0.        ,  0.        ]])
    

    numpy.dot(q,r):

    array([[  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
              1.00000000e+00],
           [  0.00000000e+00,   1.00000000e+00,   1.00000000e+00,
              1.00000000e+00],
           [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
              1.00000000e+00],
           [  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
              1.00000000e+00],
           [  1.00000000e+00,   0.00000000e+00,   1.11022302e-16,
              1.00000000e+00]])
    

    所以matrix = q*rrmatrix 的行梯形形式。剩下要做的就是为 x 求解 matrix2 = q*x0 并不总是精确的 0 的舍入问题是一个已知的以数字方式求解矩阵的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多