我正在尝试寻找独立的列来解线性方程组。下面是我的简化示例:
> 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我知道列v4和v6是独立的.
通过重新排列纸上的线性方程,我看到
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-
发布于 2013-02-19 03:05:20
使用透视信息查找一组独立的列:
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.Q提出的QR.Auxiliaries {base}中给出。特别是:
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!发布于 2013-02-19 03:05:19
如果从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] 3https://stackoverflow.com/questions/14943422
复制相似问题