0

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

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

4

2 回答 2

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$rankin q$pivot(在当前示例中不存在,其中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-18T19:05:19.897 回答
0

如果您从 v4 和 v6 开始,那么您还需要 2 个非零值 inrows 1 和 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
于 2013-02-18T19:05:18.827 回答