我正试图找到独立的列来求解线性方程组。这里是我的简化示例:
> 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-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-
使用数据透视信息查找一组独立列:
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
为什么这样做?由?qr.Q
提出的QR.Auxiliaries {base}
给出了pivot
的含义。特别是:
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$pivot
中的q$rank
(在当前示例中不存在,其中Q
是4x4正交矩阵)。
QR.Auxiliaries {base}
中的最后几行显示了这种关系:
pivI <- sort.list(a$pivot) # the inverse permutation
stopifnot(
all.equal(x[, a$pivot], qr.Q(a) %*% qr.R(a)), # TRUE
all.equal(x , qr.Q(a) %*% qr.R(a)[, pivI])) # TRUE too!
如果从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