矩阵中的R独立列

时间:2013-02-18 18:57:11

标签: r matrix linear-algebra

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

> 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 -

2 个答案:

答案 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