Python - 获取将矩阵转换为RREF所需的步骤

时间:2016-02-18 14:47:52

标签: python numpy matrix scipy linear-algebra

我有以下问题:

我有两个二进制矩阵,可能如下所示:

    | 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或更大,而不一定是正方形。我尝试实现自己的解决方案,但这太慢了。 有什么东西可以做我想要的,或者我必须尝试优化我自己的解决方案吗?

感谢您的帮助

/的Morten

2 个答案:

答案 0 :(得分:0)

事实证明它有点乱,但有一个解决方案。 scipy.linalg.qr https://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的舍入问题是以数字方式解决矩阵的已知问题。

答案 1 :(得分:0)

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

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