`qr.qy()` R中的函数

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

我找不到有关此函数的确切操作的文档。我有一个矩阵的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,]    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