我试图找到独立的列来解决线性方程组。这是我的简化示例:
> mat = matrix(c(1,0,0,0,-1,1,0,0,0,-1,1,0,0,0,-1,0,-1,0,0,1,0,0,1,-1), nrow=4, ncol=6, dimnames=list(c("A", "B", "C", "D"), paste("v", 1:6, sep="")))
> mat
v1 v2 v3 v4 v5 v6
A 1 -1 0 0 -1 0
B 0 1 -1 0 0 0
C 0 0 1 -1 0 1
D 0 0 0 0 1 -1
矩阵是满级:
qr(mat)$rank
给了我4,由于有6列,应该有6-4 = 2个独立的列,我可以从中计算其他列。 我知道列v4和v6是独立的......我的第一个问题是,如何找到这些列(可能是qr(mat)$ pivot)?
通过在纸上重新排列线性方程,我看到了 [v1,v2,v3,v4,v5,v6] = [v4,v4-v6,v4-v6,v4,v4,v6,v6]
因此我可以从v4和v6的任意值中找到位于零空间中的向量,方法是将v4和v6与下面的向量相乘:
v4 * [1,1,1,1,0,0] + v6 * [0,-1,-1,0,1,1]
我的第二个问题是:如何找到这些向量,这意味着如何解决v4和v6的矩阵? 例如
qr.solve(mat, cbind(c(0,0,0,0), c(0,0,0,0)))
给了我两个长度为6的向量,只有零。
感谢任何帮助,非常感谢!
-H -
答案 0 :(得分:3)
使用数据透视信息查找一组独立列:
q <- qr(mat)
mmat <- mat[,q$pivot[seq(q$rank)]]
mmat
## v1 v2 v3 v5
## A 1 -1 0 -1
## B 0 1 -1 0
## C 0 0 1 0
## D 0 0 0 1
qr(mmat)$rank
## [1] 4
为什么这样做? pivot
的含义在QR.Auxiliaries {base}
中提出?qr.Q
。特别是:
qr.R returns R. This may be pivoted, e.g., if a <- qr(x) then x[, a$pivot] = QR.
The number of rows of R is either nrow(X) or ncol(X) (and may depend on whether
complete is TRUE or FALSE).
为了数值稳定性,进行透视以使特征值以递减的绝对值排序。这也意味着任何0
个特征值都在q$rank
的{{1}}之外(在当前示例中不存在,q$pivot
是4x4正交矩阵)。< / p>
Q
中的最后一行显示了这种关系:
QR.Auxiliaries {base}
答案 1 :(得分:0)
如果从v4和v6开始,那么在第1和第2列中需要另外2个非零值,因此您需要选择v1和v2或v3。这些都是可能具有最高排名的基础选择。
> qr(mat[, c(1,2,4,6)])$rank
[1] 4
> qr(mat[, c(1,2,3,5)])$rank
[1] 4
> qr(mat[, c(1,3,4,6)])$rank
[1] 4
根本不是“独立列”是唯一确定的情况。可能存在必然依赖的列集,例如,彼此的标量倍数,但这不是这种情况。
另一方面,这将是排名不足:
> qr(mat[, c(1,2,3,4)])$rank
[1] 3