我有一个简单的问题:假设我在R中有一个稀疏矩阵A,如果我编码

QR<-qr(A)
Q<-qr.Q(QR)
R<-qr.R(QR)

我没有得到A的实际QR分解,但矩阵是这样的:PAP_=QR 其中P和P_是一些置换矩阵(已给出). 在大多数情况下,这可能不是问题,但为了我的目的,我相信我绝对需要‘实’矩阵Q和R,使得A=QR,其中R是上三角形.据我所知,这不适用于稀疏矩阵?目前,我正在考虑将我的矩阵转换为稠密矩阵,然后应用qr()函数(因为对于稠密矩阵,似乎没有这样的排列);然而,这似乎有点愚蠢.我想手工编写QR因式分解太复杂了,不是吗? 有人能帮助解决这个问题吗?

附注:我是堆栈溢出的新手,我经常在数学论坛上;我可以不在这里用Latex写东西吗?

编辑:我应该提一下,上面的内容适用于矩阵包中的QR分解.显然,我可以使用基本的QR函数,但从数值上看,这似乎不是很好.(不过,这可能是我最好的 Select ?)

推荐答案

dgCMatrixqr方法将mn的矩阵A(具有m >= n)分解为:

P1 * A * P2 = Q * R    <==>    A = P1' * Q * R * P2'

其中P1P2是置换矩阵.在C级别,有一个禁用列旋转的选项,因此P2是一个单位矩阵.然后你会得到A = Q~ * R,其中Q~ = P1' * Q是正交的(因为P1Q是正交的),你会得到qr.QQ~qr.RR.

遗憾的是,在当前的Matrix版本1.5-4中,该选项没有在R级别公开.要从R禁用列旋转,您必须直接调用C代码(在本例之外,我强烈反对这样做):

library(Matrix)
set.seed(1)
x <- rsparsematrix(10L, 10L, 0.5)
stopifnot(is(x, "dgCMatrix"), validObject(x),
          packageVersion("Matrix") == "1.5-4")

qr.x <- qr(x)
all.equal(as(qr.Q(qr.x) %*% qr.R(qr.x), "matrix"), as(x, "matrix"))
## [1] "Mean relative difference: 1.059398"

qr.x <- .Call(Matrix:::dgCMatrix_QR, x, 0L, FALSE)
all.equal(as(qr.Q(qr.x) %*% qr.R(qr.x), "matrix"), as(x, "matrix"))
## [1] TRUE

碰巧的是,在过go 的一个月里,我花了相当多的时间重构Matrix中的分解代码.在Matrix 1.6-0(尚未发布)中,您will可以 Select 禁用列旋转,有qr(x, order = 0L).

一个副作用是,所有矩阵分解类和方法的文档都将得到极大改进.所以,人们可以期待……

R相关问答推荐

R根据名称的载体对收件箱列采取行动

我可以截断10字节的扩展数并转换为8字节的double吗?

R -模运算后的加法

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

查找满足SpatRaster中条件的单元格位置

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

r替换lme S4对象的字符串的一部分

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

如何从像glm这样的模型中提取系数表的相关性?

有效识别长载体中的高/低命中

如何删除最后一个可操作对象

在保留列表元素属性的同时替换列表元素

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

R -基线图-图形周围的阴影区域

为R中的16组参数生成10000个样本的有效方法是什么?

当由base::限定时,`[.factor`引发NextMethod错误

名字的模糊匹配

R中的Desolve:返回的导数数错误

R将函数参数传递给ggploy

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?