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

 

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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flowable从入门到源码分析

什么是工作流&#xff1f; 工作流&#xff0c;是把业务之间的各个步骤以及规则进行抽象和概括性的描述。使用特定的语言为业务流程建模&#xff0c;让其运行在计算机上&#xff0c;并让计算机进行计算和推动。 工作流解决的痛点在于&#xff0c;解除业务宏观流程和微观逻辑的…

jenkins gitlab asp.net core持续集成

什么是jenkins Jenkins直接取自其官方文档&#xff0c;是一个独立的开源自动化服务器&#xff0c;您可以使用它来自动执行与构建、测试、交付或部署软件相关的各种任务。 jenkins可以干什么 Jenkins 通过自动执行某些脚本来生成部署所需的文件来工作。这些脚本称为JenkinsFi…

2023_深入学习HTML5

H5 基于html5和 css3和一部分JS API 结合的开发平台(环境) 语义化标签 header : 表示头部&#xff0c;块级元素 footer &#xff1a; 表示底部&#xff0c;块级元素 section &#xff1a;区块 nav &#xff1a; 表示导航链接 aside &#xff1a; 表示侧边栏 output &am…

二叉搜索树(BSTree)

目录 一、二叉搜索树 二、二叉搜索树的接口及实现 1、二叉搜索树的查找 2、二叉搜索树的插入 3、二叉搜索树的删除 三、二叉搜索树的递归版本 本期博客主要分享二叉搜索树的底层实现。(主要是笔记&#xff0c;供自己复习使用&#x1f602;) 一、二叉搜索树 二叉搜索树(B…

MybatisPlus主键策略

Mybatis默认主键策略是TableId(type IdType.ASSIGN_ID) 这是默认策略雪花算法 此时主键类型可以是String 数据表字段类型可以是bigint int varchar 无需数据表主键自增 TableId(type IdType.ASSIGN_AUTO) 是主键自增策略:该策略为跟随数据库表的主键递增策略&…

一致性框架设计方案

补充组件依赖 前言 对于供应链业务&#xff0c;一般对数据一致性要求高。且由于业务复杂&#xff0c;可能会存在一个业务功能触发几个异步操作的场景&#xff0c;且要保证相关操作同时触发或不触发。 为了降低技术设计难度、代码编写难度&#xff0c;特意设计最终一致性框架&a…

ChatGPT+Ai绘图【stable-diffusion实战】

ai绘图 stable-diffusion生成【还有很大的提升空间】 提示词1 Picture a planet where every living thing is made of light. The landscapes are breathtakingly beautiful, with mountains and waterfalls made of swirling patterns of color. What kind of societies m…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f; 回答最多的一定是&#xff1a;跳槽&#xff01; 前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;” 截图来源于知乎&#xff0c;…

摄影知识整理

目录 焦距 焦距分类 对焦 相机的MF与AF 自动对焦操作 自动对焦方式 镜头防抖 防抖模式 景深 景深的作用 影响景深的因素 景深预览 摄影三大元素 光圈 光圈的作用 光圈与景深的关系 感光度&#xff08;ISO) 注意 感光度的作用 快门 B门与T门 快门速度 闪…

【SSM】SpringMVC(三:SpringMVC拦截器)

文章目录 1. 登录案例2. 拦截器2.1 应用2.2 拦截器的执行原理2.3 拦截器执行的时机2.4 拦截器的实现方法2.5 拦截器的实现步骤2.6 开发拦截器 1. 登录案例 【login.jsp】 <%--Created by IntelliJ IDEA.User: BeyongDate: 2023/4/17Time: 11:43To change this template use…

SQL的函数

文章目录 一、SQL LCASE() 函数二、SQL MID() 函数三、SQL LEN() 函数四、SQL ROUND() 函数五、SQL NOW() 函数六、SQL FORMAT() 函数总结 一、SQL LCASE() 函数 LCASE() 函数把字段的值转换为小写。 SQL LCASE() 语法 SELECT LCASE(column_name) FROM table_name;用于 SQL …

入行IC选择国企、私企还是外企?(内附各IC大厂薪资福利情况)

不少人想要转行IC&#xff0c;但不知道该如何选择公司&#xff1f;下面就来为大家盘点一下IC大厂的薪资和工作情况&#xff0c;欢迎大家在评论区补充。 一&#xff0e;老 牌 巨 头 在 IC 设计领域深耕许久&#xff0c;流程完善、技术扎实&#xff0c;公司各项制度都很完善、前…

IT知识百科:什么是暴力破解?

暴力破解是一种常见的网络安全攻击方法&#xff0c;它利用计算机程序自动尝试大量的密码组合来破解密码。这种攻击方法通常用于获取未经授权的访问权限&#xff0c;如入侵网络系统或个人账户。在本文中&#xff0c;我们将探讨暴力破解的原理、工具和防范方法。 暴力破解的原理 …

TCP/UDP协议 (详解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Linux搭建SVN服务器详细教程

前言 本文讲解 Linux 系统下如何搭建 SVN 服务器&#xff0c;详细说明各配置项的功能&#xff0c;最终实现可管控多个项目的复杂配置。 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;实现最终集…

HANA SDA连接外部数据库到BW的步骤

咱都知道&#xff0c;我们不能直接从BW连接到外部数据库。第一步得从HANA database通过SDA去建一个到外部DB的连接。 数据库连接好了&#xff0c;那么接下来别忘了&#xff0c;还得建一个源系统。 也就是说第一步&#xff0c;我们要用HANA SDA通过Linux ODBC driver去连接外部…

PHP快速入门05-时间日期与时区,附30个常用案例

文章目录 前言一、时间日期与时区1.1 时间与日期1.2 时区 二、 30个日期时间函数的用法示例2.1 获取当前的时间戳2.2 将时间戳格式化为日期时间2.3 获取当前的日期2.4 获取当前的时间2.5 获取当前年份2.6 获取当前月份2.7 获取当前日期的第几天2.8 计算两个日期之间的天数差2.9…

【生活工作经验 十】ChatGPT模型对话初探

最近探索了下全球大火的ChatGPT&#xff0c;想对此做个初步了解 一篇博客 当今社会&#xff0c;自然语言处理技术得到了迅速的发展&#xff0c;人工智能技术也越来越受到关注。其中&#xff0c;基于深度学习的大型语言模型&#xff0c;如GPT&#xff08;Generative Pre-train…

Java:MybatisPlus--条件构造器

1、条件构造器类别 ①wrapper&#xff1a;抽象类&#xff0c;条件类的顶层&#xff0c;提供了一些获取和判断相关的方法。 ②AbstractWrapper&#xff1a;抽象类&#xff0c;Wrapper的子类&#xff0c;提供了所有的条件相关方法。 ③AbstractLambdaWrapper&#xff1a;抽象类…

Tinymce富文本编辑器在vue项目中的使用;引入第三方插件和上传视频、图片等

先放张效果图 第一步&#xff1a;安装依赖 npm install tinymce5.0.12 第二步&#xff1a;在项目中的public文件夹中新建tinymce文件夹&#xff08;因为我的项目是脚手架创建的&#xff0c;所以公共文件夹是public&#xff09;&#xff1b;在node_modules中找到skins文件夹复制…