草庐IT

Python矩阵分解之QR分解

微小冷 2023-07-13 原文

文章目录

QR和RQ分解

A A A为方阵, P , Q P, Q P,Q分别为正交单位阵和上三角阵,则形如 A = Q R A=QR A=QR的分解为QR分解;形如 A = R Q A=RQ A=RQ的分解为RQ分解。

scipy.linalg中,为二者提供了相同的参数,除了待分解矩阵a之外,还有下列参数

  • overwrite_a 默认为False,为True时,将在矩阵分解时覆盖a的值
  • lwork 工作数组的尺寸
  • mode 默认'full',用于调整返回值,可选4个参数
    • 'full':返回 Q Q Q R R R
    • 'r':返回 R R R
    • 'economic':返回 Q Q Q R R R,但是合并在一起
    • 'raw':返回 Q Q Q T A U TAU TAU矩阵
  • pivoting 默认False,当为True时,计算 A P = Q R AP=QR AP=QR,但要求选择合适的 P P P,从而让 R R R的对角线非递增
  • check_finite 默认为True,表示检查是否有限
import numpy as np
import scipy.linalg as sl
A = np.random.rand(3,3)
q1,r1 = sl.qr(A)
r2,qr = sl.rq(A)

结果得到 q 1 q_1 q1 q 2 q_2 q2分别为,可见二者并不相等。

q 1 = [ − 0.659450021160935 0.749759308692653 0.0546502389707366 − 0.180811070132312 − 0.0876283110599659 − 0.979606367893955 − 0.729680085043063 − 0.65588280822834 0.193351274529173 ] q 2 = [ 0.377636504144627 − 0.925556186272606 0.0271370003857254 − 0.0674267508884556 0.00174208653633345 0.99772270616596 − 0.923495697879558 − 0.378606274627098 − 0.0617493709355736 ] q_1 = \left[\begin{matrix}-0.659450021160935 & 0.749759308692653 & 0.0546502389707366\\-0.180811070132312 & -0.0876283110599659 & -0.979606367893955\\-0.729680085043063 & -0.65588280822834 & 0.193351274529173\end{matrix}\right]\\ q_2=\left[\begin{matrix}0.377636504144627 & -0.925556186272606 & 0.0271370003857254\\-0.0674267508884556 & 0.00174208653633345 & 0.99772270616596\\-0.923495697879558 & -0.378606274627098 & -0.0617493709355736\end{matrix}\right] q1= 0.6594500211609350.1808110701323120.7296800850430630.7497593086926530.08762831105996590.655882808228340.05465023897073660.9796063678939550.193351274529173 q2= 0.3776365041446270.06742675088845560.9234956978795580.9255561862726060.001742086536333450.3786062746270980.02713700038572540.997722706165960.0617493709355736

但是 q 1 r 1 q_1r_1 q1r1的确是等于 r 2 q 2 r_2q_2 r2q2的。

>>> q1@r1
array([[0.81677429, 0.63368526, 0.84867074],
       [0.22394697, 0.10848293, 0.58357567],
       [0.90375906, 0.37051483, 0.06042968]])
>>> q2@r2
array([[-0.09631134, -0.22572231, -0.15900946],
       [ 0.01719633, -0.05246553, -0.90632485],
       [ 0.23552571, -0.94691613,  1.13446376]])
>>> r2@q2
array([[0.81677429, 0.63368526, 0.84867074],
       [0.22394697, 0.10848293, 0.58357567],
       [0.90375906, 0.37051483, 0.06042968]])

其他函数

除了qrrq这两个函数外,scipy.linalg还提供了其他与qr分解相关的函数。

qr_multiply(a,c),在对 A A A进行 Q R QR QR分解之后,返回 C Q CQ CQ,其参数中,overwrite_a, overwrite_c, privotingqr函数中的作用相同,或可类比。此外,还有其他两个参数

  • mode 可选leftright,分别表示返回 Q C QC QC C Q CQ CQ
  • conjugateTrue时,返回Q的复共轭

qr_update(Q, R, u, v),若 A = Q R A=QR A=QR是QR分解,则返回 A + u v T A+uv^T A+uvT的QR分解。此函数也支持overwrite_qruv, check_finite参数。

qr_delete(Q,R,k,p)qr_insert(Q,R,u,k)分别用于矩阵的删减和增添,对于 A = Q R A=QR A=QR而言,前者从第 k k k行/列删掉 p p p行/列;后者在第 k k k行/列插入 U U U

这两个函数均支持check_finite,覆写开关分别是overwrite_qroverwrite_qru,通过which来调整插入/删除的是行还是列,即which='row'时,针对行操作,为'cols'时,针对列操作。

有关Python矩阵分解之QR分解的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  10. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

随机推荐