`qr.qy()` R中的函数
我找不到有关此函数的确切操作的文档。我有一个矩阵的QR分解`qr.qy()` R中的函数,r,function,R,Function,我找不到有关此函数的确切操作的文档。我有一个矩阵的QR分解X: X = matrix(c(1,1,1,1,-1.5,-0.5,0.5,1.5,2.25,0.25,0.25, 2.25,-3.275,-0.125,0.125,3.375), nrow=4, byrow=F) [,1] [,2] [,3] [,4] [1,] 1 -1.5 2.25 -3.375 [2,] 1 -0.5 0.25 -0.125 [3,] 1 0.5 0.25 0.125 [4,
X
:
X = matrix(c(1,1,1,1,-1.5,-0.5,0.5,1.5,2.25,0.25,0.25, 2.25,-3.275,-0.125,0.125,3.375),
nrow=4, byrow=F)
[,1] [,2] [,3] [,4]
[1,] 1 -1.5 2.25 -3.375
[2,] 1 -0.5 0.25 -0.125
[3,] 1 0.5 0.25 0.125
[4,] 1 1.5 2.25 3.375
函数qr(X)
生成一个列表:
$qr (rounding output)
[,1] [,2] [,3] [,4]
[1,] -2.0 0 -2.5 0
[2,] 0.5 -2.236 0 -4.583
[3,] 0.5 0.447 2 0
[4,] 0.5 0.894 -0.929 -1.341
$rank
[1] 4
$qraux
[1] 1.500000 1.000000 1.368524 1.341641
$pivot
[1] 1 2 3 4
attr(,"class")
[1] "qr"
我选择qr(X)$qr
的对角线元素,我将其命名为z
:
z = qr(X)$qr
z = Q * (row(Q) == col(Q))
[,1] [,2] [,3] [,4]
[1,] -2 0.000000 0 0.000000
[2,] 0 -2.236068 0 0.000000
[3,] 0 0.000000 2 0.000000
[4,] 0 0.000000 0 -1.341641
到目前为止,一切顺利。下一个电话我不明白:
(raw = qr.qy(qr(X), z))
[,1] [,2] [,3] [,4]
[1,] 1 -1.5 1 -0.3
[2,] 1 -0.5 -1 0.9
[3,] 1 0.5 -1 -0.9
[4,] 1 1.5 1 0.3
取得一些进展: 因此,多亏了答案和一些阅读,我认为对象
qr(X)$qr
在上三角形中完全包含R:
[,1] [,2] [,3] [,4]
[1,] -2.0 0 -2.5 0
[2,] -2.236 0 -4.583
[3,] 2 0
[4,] -1.341
qr(X)$qr
的下三角包含有关Q的信息:
[,1] [,2] [,3] [,4]
[1,]
[2,] 0.5
[3,] 0.5 0.447
[4,] 0.5 0.894 -0.929
以某种方式调用qr.Q(qr(X))
在内部使用函数qr.qy()
返回Q,其中qr()和1的对角矩阵作为输入
但这一行动是如何进行的?Q右上角的其余部分是如何填充的?我认为它使用了$qraux
,但它如何实现:
[,1] [,2] [,3] [,4]
[1,] -0.5 0.6708204 0.5 0.2236068
[2,] -0.5 0.2236068 -0.5 -0.6708204
[3,] -0.5 -0.2236068 -0.5 0.6708204
[4,] -0.5 -0.6708204 0.5 -0.2236068
简而言之,qr.qy()具体是如何工作的?
我刚刚发现:“qy.qr():返回矩阵乘法的结果:Q%*%y,其中Q是由qr表示的nrow(x)正交(或幺正)变换的阶数。”来自qr分解的矩阵
Q
仅隐含在函数qr
的返回值中。
列表元素qr
是Q矩阵的紧凑表示;
它包含在列表元素qr
的下三角部分和向量qrax
中。
QR分解的上三角矩阵R
是返回值中列表元素QR
的上三角部分
经过一些中间步骤后,R函数qr.qy
最终调用Lapack子例程domqr
,该子例程不会显式生成Q
矩阵。
它使用列表元素qr
和qraux
中包含的信息。
看
因此qr.qy
不会将Q
的紧凑形式转换为实际的Q
。
它使用压缩形式来计算Q%*%z
R函数qr.Q
(您已经完成)使用qr.qy
和对角线上有1的对角矩阵来生成Q
为什么要这样做?为了提高效率
使用以下代码,您可以检查这一点:
library(rbenchmark)
benchmark(qr.qy(XQR,z), {Q <- qr.Q(qr(X)); Q %*% z}, { Q %*% z},
replications=10000,
columns=c("test","replications","elapsed","relative") )
库(rbenchmark)
基准测试(qr.qy(XQR,z),{Q你似乎认为矩阵qr(X)$qr
是Q
矩阵。它不是。它是Q矩阵的紧凑表示形式。如果您想要实际的Q矩阵,请使用qr.Q
函数。请参阅文档;在qr
函数的帮助页面上有一个指向qr
的链接。只需执行Q不,它不会生成Q
。它使用spe我使用了一些例程来执行乘法,而不生成显式的Q
。谢谢。所以当你说它不生成Q时,你的意思是qr.qy()
不生成Q,对吗?所以它有点绕过Q,但它乘以Q和z后的结果是相同的,就好像它使用了Q一样?我有没有办法说服你写一个正式的答案?你似乎以这样的方式编辑了原始问题,Q
不再生成。不应该z=qr(X)$qr
实际上是Q=qr(X)$qr
?我会看看我能做些什么来编写一个正式的答案,而不让它太长。+1非常感谢。我不知道你已经回答了我的问题。你是否碰巧有任何参考资料或可能有一些额外的单词…我正在努力找出如何生成这个答案“紧凑Q”矩阵。例如,我想知道这些“反射器”是否有一个很好的解释……例如,为了集中我的研究,有没有提到“紧凑形式”的矩阵(T或V…)"你提到的。你包含的链接代码太多,我无法理解。或多或少。请参阅以获取解释和参考。任何关于线性代数的好书都应该给出解释。例如,Golub和van Loan:矩阵计算。我包含的链接是指向R使用的Lapack代码的链接。我在希望中发布了一份赏金我会吸引你添加额外的计算/数学细节。我有文章,看了你的链接,等等。但我仍在努力。。。
test replications elapsed relative
3 { Q %*% z} 10000 0.022 1.000
2 { Q <- qr.Q(qr(X)); Q %*% z} 10000 0.486 22.091
1 qr.qy(XQR, z) 10000 0.152 6.909