r - R和Matlab中复矩阵QR分解的区别
问题描述
使用下面的矩阵A
,我在 [R] 和 Matlab 之间的 QR 分解中得到了 R 的不同矩阵。(当然,Q 也不同。)
A <- structure(c(1+0i, -0.75+0.75i, 0+0i, 0+0i, 1+0i, -0.75+0.75i,
1+0i, -1.5+1.5i, 0-1i), .Dim = c(3L, 3L))
QR <- qr(A)
Q <- qr.Q(A)
R <- qr.R(QR)
R
[,1] [,2] [,3]
[1,] -2.54951+0i 0.8825226+0.8825226i -1.27475488+0.0000000i
[2,] 0.00000+0i -0.7531983+0.0000000i -0.49787685+0.4978768i
[3,] 0.00000+0i 0.0000000+0.0000000i -0.06509446+0.0000000i
而使用 Matlab:
[Q,R] = qr(A);
R =
-1.4577 + 0.0000i 0.5145 + 0.5145i -2.2295 - 0.0000i
0.0000 + 0.0000i -1.2632 + 0.0000i 0.8732 - 0.8732i
0.0000 + 0.0000i 0.0000 + 0.0000i -0.0679 + 0.0000i
检查 R 软件的分解,我必须重新排序 R 矩阵的列以A
使用重新创建我的原始矩阵Q %*% R[, QR$pivot]
,但这当然会破坏 R 的上三角特性:
zapsmall(Q %*% R[, QR$pivot])
[,1] [,2] [,3]
[1,] 1.00+0.00i 0.00+0.00i 1.0+0.0i
[2,] -0.75+0.75i 1.00+0.00i -1.5+1.5i
[3,] 0.00+0.00i -0.75+0.75i 0.0-1.0i
而使用 Matlab,直接Q * R
工作:
Q * R
ans =
1.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i
-0.7500 + 0.7500i 1.0000 + 0.0000i -1.5000 + 1.5000i
0.0000 + 0.0000i -0.7500 + 0.7500i 0.0000 - 1.0000i
我意识到 QR 分解不是唯一的,但我需要得到一个上三角 R 矩阵,就像在 Matlab 中一样,我可以随后使用它而无需重新排列它的列,这样Q %*% R = A
.
R软件中关于我如何实现这一目标的任何建议?
更新:建议可以在此处回答问题,但该答案仅适用于实矩阵,而我的查询适用于complex。
解决方案
推荐阅读
- python - 使 MongoDB 适应 mongoengine 文档
- python - 在 Python 中将视频转换为帧 - 1 FPS
- node.js - 有没有更方便的方法将普通的 js 对象映射到 grcp 响应类?
- javascript - 如何在一个链接中执行两个事件:事件 onClick 到外部页面(_blank)和内部页面(_self)?
- javascript - 如何使用 jQuery live 获取选中和未选中的值?
- javascript - JavaScript RegEx:将具有动态长度的字符串格式化为块格式
- python - 从 URL 不变的网站中抓取数据
- r - 为什么要引用函数名
- c++ - 如果在多个共享库中调用并且启用了 libstdc++ 静态链接,C++ 流会变坏
- python - 仅针对 ModelViewSet Django Rest Framework 的一种特定方法的分页