矩阵中的R个独立列



我正试图找到独立的列来求解线性方程组。这里是我的简化示例:

> 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

相关内容

  • 没有找到相关文章

最新更新