我有以下问题:
我有两个二进制矩阵,可能如下所示:
| 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
答案 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*r
和r
是matrix
的行梯队形式。剩下要做的就是为x解决matrix2 = q*x
。 0
并非总是0
的舍入问题是以数字方式解决矩阵的已知问题。
答案 1 :(得分:0)
水平连接矩阵c = np.c_[a,b]
并在该矩阵上使用rref
,这样您就不需要存储中间矩阵。
请注意rref
除非是非常非常特殊的场合,否则在计算上无用。因此,如果必须,请更喜欢LU分解。