C#,码海拾贝(19)——一般实矩阵的QR分解(QR Decomposition)方法之C#源代码,《C#数值计算算法编程》源代码升级改进版

news2024/11/26 11:51:05

 

1 实矩阵

实矩阵,指的是矩阵中所有的数都是实数的矩阵。如果一个矩阵中含有除实数以外的数,那么这个矩阵就不是实矩阵。

 

2 QR(正交三角)分解法


QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。它是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。
如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解。
矩阵的正交分解又称为QR分解,是将矩阵分解为一个正交矩阵Q和一个上三角矩阵的乘积的形式。
任意实数方阵A,都能被分解为。这里的Q为正交单位阵,即。R是一个上三角矩阵。这种分解被称为QR分解。

QR分解也有若干种算法,常见的包括Gram–Schmidt、Householder和Givens算法。

QR分解是将矩阵分解为一个正交矩阵与上三角矩阵的乘积。

3 分解流程

(1)对需要求解的特征值的矩阵进行QR分解
(2)对分解出来的结果进行逆向相乘
(3)将相乘得到的矩阵进行QR分解
(4)对分解出来的结果进行逆向相乘

4 实用意义

使用qr分解有助于加快解方程或求解速度即收敛速度。

5 应用领域

系统辨识是现代控制理论的重要组成部分。对系统的结构和参数进行辨识在工程上和理论上都占有重要的地位。最小二乘法是系统参数辨识中的重要估计方法,并在众多领域和场合得到了广泛的应用。
 

6 QR(正交三角)分解法C#源程序

using System;

namespace Zhou.CSharp.Algorithm
{
    /// <summary>
    /// 矩阵类
    /// 作者:周长发
    /// 改进:深度混淆
    /// https://blog.csdn.net/beijinghorn
    /// </summary>
    public partial class Matrix
    {
        /// <summary>
        /// 一般实矩阵的QR分解,分解成功后,原矩阵将成为R矩阵
        /// </summary>
        /// <param name="src">源矩阵</param>
        /// <param name="mtxQ">分解后的Q矩阵</param>
        /// <returns>求解是否成功</returns>
        public static bool SplitQR(Matrix src, Matrix mtxQ)
        {
            int i, j, k, z, nn, p, jj;
            double u, alpha, w, t;

            if (src.Rows < src.Columns)
            {
                return false;
            }
            // 初始化Q矩阵
            if (!mtxQ.Init(src.Rows, src.Rows))
            {
                return false;
            }
            // 对角线元素单位化
            for (i = 0; i <= src.Rows - 1; i++)
            {
                for (j = 0; j <= src.Rows - 1; j++)
                {
                    z = i * src.Rows + j;
                    mtxQ[z] = 0.0;
                    if (i == j)
                    {
                        mtxQ[z] = 1.0;
                    }
                }
            }

            // 开始分解
            nn = src.Columns;
            if (src.Rows == src.Columns)
            {
                nn = src.Rows - 1;
            }
            for (k = 0; k <= nn - 1; k++)
            {
                u = 0.0;
                z = k * src.Columns + k;
                for (i = k; i <= src.Rows - 1; i++)
                {
                    w = Math.Abs(src[i * src.Columns + k]);
                    if (w > u)
                    {
                        u = w;
                    }
                }
                alpha = 0.0;
                for (i = k; i <= src.Rows - 1; i++)
                {
                    t = src[i * src.Columns + k] / u;
                    alpha = alpha + t * t;
                }

                if (src[z] > 0.0)
                {
                    u = -u;
                }
                alpha = u * Math.Sqrt(alpha);
                if (Math.Abs(alpha) < float.Epsilon)
                {
                    return false;
                }
                u = Math.Sqrt(2.0 * alpha * (alpha - src[z]));
                if ((u + 1.0) != 1.0)
                {
                    src[z] = (src[z] - alpha) / u;
                    for (i = k + 1; i <= src.Rows - 1; i++)
                    {
                        p = i * src.Columns + k;
                        src[p] = src[p] / u;
                    }

                    for (j = 0; j <= src.Rows - 1; j++)
                    {
                        t = 0.0;
                        for (jj = k; jj <= src.Rows - 1; jj++)
                        {
                            t = t + src[jj * src.Columns + k] * mtxQ[jj * src.Rows + j];
                        }
                        for (i = k; i <= src.Rows - 1; i++)
                        {
                            p = i * src.Rows + j;
                            mtxQ[p] = mtxQ[p] - 2.0 * t * src[i * src.Columns + k];
                        }
                    }

                    for (j = k + 1; j <= src.Columns - 1; j++)
                    {
                        t = 0.0;

                        for (jj = k; jj <= src.Rows - 1; jj++)
                        {
                            t = t + src[jj * src.Columns + k] * src[jj * src.Columns + j];
                        }
                        for (i = k; i <= src.Rows - 1; i++)
                        {
                            p = i * src.Columns + j;
                            src[p] = src[p] - 2.0 * t * src[i * src.Columns + k];
                        }
                    }

                    src[z] = alpha;
                    for (i = k + 1; i <= src.Rows - 1; i++)
                    {
                        src[i * src.Columns + k] = 0.0;
                    }
                }
            }
            // 调整元素
            for (i = 0; i <= src.Rows - 2; i++)
            {
                for (j = i + 1; j <= src.Rows - 1; j++)
                {
                    p = i * src.Rows + j;
                    z = j * src.Rows + i;
                    t = mtxQ[p];
                    mtxQ[p] = mtxQ[z];
                    mtxQ[z] = t;
                }
            }

            return true;
        }
    }
}

POWER BY 315SOFT.COM

 

The QR decomposition (or QR factorization) allows us to express a matrix having linearly independent columns as the product of 1) a matrix Q having orthonormal columns and 2) an upper triangular matrix R.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot制作一个宿舍报修小程序

制作一个宿舍报修小程序&#xff0c;让学生实现快速报修&#xff0c;将流程进行精简&#xff0c; 便于管理部门有效响应。 微信小程序实战开发专栏 一、小程序1.1 项目创建1.2 首页iconfont图标引入1.3 报修管理报修提交报修记录报修溯源1.4 来访登记1.5 公告通知二、API2.1 Sp…

windows日志捕获工具-DebugView使用教程

debugview 是一款捕获windows桌面系统程序中由TRACE(debug版本)和OutputDebugString输出的信息。 1、双击打开DebugView.exe工具&#xff0c;看到如下界面&#xff1a; 其中这里 Include代表过滤想要的关键字&#xff0c;一般不会找自己想要的关键字日志就设置成星号*&#xf…

GDOUCTF WEB

web hate eat snake 游戏题找js&#xff0c;将判断语句删掉即可 ezweb 看源码找到/src路由&#xff0c;找到源码 import flaskapp flask.Flask(__name__)app.route(/, methods[GET]) def index():return flask.send_file(index.html)app.route(/src, methods[GET]) def so…

如何快速开发软件?这篇文章说明白了

随着经济迅速发展&#xff0c;传统软件开发模式存在研发周期长、需求转化困难、投入成本高等问题&#xff0c;无法适应当前业务发展速度,市场需要快速开发工具。快速开发软件可分为代码生成类、少代码类、零代码功能配置类。代码生成类相对灵活&#xff0c;但对用户要求高&…

MySQL group_concat设置group_concat_max_len

GROUP_CONCAT函数用于将多个字符串连接成一个字符串&#xff0c;在拼接成字符串时就会存在拼接长度的问题&#xff0c;mysql 默认的拼接最大长度为1024 个字节&#xff0c;由于1024个字节会出现不够用的情况&#xff0c;所以有时需要去根据情况进行修改&#xff0c;方式如下。 …

nginx启动、配置、测试(全网最全)

目录 一、要求 1.配置不同IP访问 2.配置不同端口访问 3.配置域名访问 二、前期准备 1.安装gcc g的依赖库 2.安装 pcre的依赖库 3.安装zlib的依赖库 4.安装openssl的依赖库 5.解压nginx的安装包 6.进入到解压的nginx安装目录里面 7.将nginx安装到/usr/local/下 8.编译 9.进入到…

从 Python 中的字典列表中删除重复项

要从字典列表中删除重复项&#xff1a; 使用字典推导来遍历列表。使用每个 id 属性的值作为键&#xff0c;使用字典作为值。使用 dict.values() 方法只获取唯一的字典。使用 list() 类将结果转换为列表。 list_of_dictionaries [{id: 1, site: jiyik.com},{id: 2, site: goo…

5G NR调制阶数与EVM关系以及对系统SNR要求分析

移动通信技术对数据传输速率要求越来越高。一种提高传输速率的思路是使用更高阶的QAM 调制方式&#xff0c;例如5G NR 的256QAM PDSCH&#xff0c;微波的1024QAM&#xff0c;2048QAM和4096QAM 调制。更高阶的QAM 调制方式对系统也提出了更高的要求。例如某个系统的EVM 测试结果…

微服务+springcloud+springcloud alibaba学习笔记【Hystrix(豪猪哥)的使用】(6/9)

Hystrix&#xff08;豪猪哥&#xff09;的使用 6/91、Hystrix熔断器概述2、HyStrix重要概念3、hystrix案例3.1 新建模块 Cloud-provider-hystrix-payment80013.2 创建带降级的order模块 Cloud-comsumer-feign-hystrix-order803.3 配置服务降级:3.3.1 服务降级 Cloud-provider-h…

企业做体系认证要警惕的8大问题,别再被不良认证机构忽悠啦!

企业资质认证要警惕这八大问题 企业资质真的很管用。我们都知道从事任何一个行业都需要准入证明&#xff0c;尤其是招投标企业&#xff0c;企业资质更是投标的准入门槛&#xff0c;并且在投标中还可以为企业加分。 有些资质如ISO三体系是企业必备的资质之一&#xff0c;也是常…

麻了,不要再动不动就BeanUtil.copyProperties

前言 最近项目上要求升级一个工具包hutool的版本&#xff0c;以解决安全漏洞问题&#xff0c;这不升级还好&#xff0c;一升级反而捅出了更大的篓子&#xff0c;究竟是怎么回事呢&#xff1f; 事件回顾 我们项目原先使用的hutool版本是5.7.2&#xff0c;在代码中&#xff0c…

Hudi集成Flink-写入方式

文章目录一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表1.2.3、将 kakfa 数据写入hudi1、k…

ERTEC200P-2 PROFINET设备完全开发手册(4-2)

4.2 XHIF接口实验 4.2.1写入单片机固件 首先按照下图连接设备 用JLINK 20Pin JTAG连接4 Pin SWD可以采用转接板 单片机的参考程序是用ST的CubeIDE生成的&#xff0c;目前的版本是1.7.0。打开安装后的CubeIDE&#xff0c;在菜单中选择“File->Import“ 选择“Existing Proj…

企业信息化建设都包括哪些方面?

随着大数据技术的发展&#xff0c;时代的发展要求企业转变管理模式、建立信息化管理机制&#xff0c;同时也是提高工作、管理效率&#xff0c;促进企业战略性发展的重要保障。 企业信息化是将信息技术应用于企业发展实践中的一个动态过程&#xff0c;即通过挖掘先进的管理理念…

高可靠多层板制造服务再获认可!华秋荣获创想三维优秀质量奖

4月10日&#xff0c;创想三维2023年度战略供应商大会在惠州成功举办&#xff0c;高可靠多层板制造商华秋出席了本次活动并取得了《优秀质量奖》一奖项。 大会现场&#xff0c;创想三维董事长陈春指出公司的持续发展与供应链高质量的交付息息相关。作为创想三维主力PCB供应商&am…

【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案

原本正常的正版系统&#xff0c;在昨天4月自动更新安装之后&#xff0c;发现右键找 不到新建文档了&#xff0c;word,ppt,excel都不见了。 看了网上大神的方法 Win11安装了Office右键没有新建Excel选项怎么办&#xff1f; - 知乎 可以解决一部分 官方解决方案&#xff0c;亲…

李宏毅2021春季机器学习课程视频笔记14-Transformer

Transformer Transformer实际上就是变形金刚&#xff0c;其与Bert实际类似。其实际上就是一个Sequence-to-Sequence的模型&#xff0c;其输出的长度并不是由人为指定&#xff0c;而是由机器自行确定。 Transformer的基本结构&#xff0c;如上图所示&#xff0c;主要由一个Encod…

AS01/AS02/AS03 创建定制屏幕字段

本文简介&#xff1a;在sap标准屏幕上&#xff0c;增加客户定制的屏幕字段。 操作步骤&#xff1a; 1、在创建资产卡片AS01时&#xff0c;界面需要输入客户定制的字段&#xff0c;如下图方框所示 2、查看增强点&#xff0c;事务码&#xff1a;SMOD AIST002 3、创建增强项目…

M1 M2上能安装上Autocad 2024 Mac 中文版吗 autocad m1 m2版本有啦 终于支持Ventura 13x了

AutoCAD是一款强大的工具&#xff0c;适合于各种领域的设计和绘图。它具有二维图形和三维建模功能、多种文件格式支持、自定义命令和样式、批处理和脚本等特点&#xff0c;可以帮助用户实现高质量的设计和建模。同时&#xff0c;还支持云端存储和共享&#xff0c;方便用户随时随…

【Linux】-- 进程概念的引入

目录 硬件 冯诺依曼体系结构 冯诺依曼体系结构推导 重点概念 网络数据流向 软件 操作系统(Operator System - OS) 概念 定位 进程内核数据结构PCB&#xff08;task_struct&#xff09; 通过系统调用创建进程-fork初始 fork基本用法 使用if进行分流 查看运行效果 …