C#,码海拾贝(16)——求“矩阵秩”的全选主元“高斯消去法(Gauss Elimination)”C#源代码,《C#数值计算算法编程》源代码升级改进版

news2025/6/18 0:45:27

1 矩阵的秩 Rank of Matrix

矩阵的秩是线性代数中的一个概念。在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数,通常表示为r(A),rk(A)或rank A。
在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数目。类似地,行秩是A的线性无关的横行的极大数目。即如果把矩阵看成一个个行向量或者列向量,秩就是这些行向量或者列向量的秩,也就是极大无关组中所含向量的个数。

2 相关定义 Rank of you


方阵(行数、列数相等的矩阵)的列秩和行秩总是相等的,因此它们可以简单地称作矩阵A的秩。通常表示为r(A),rk(A)或。
m × n矩阵的秩最大为m和n中的较小者,表示为 min(m,n)。有尽可能大的秩的矩阵被称为有满秩;类似的,否则矩阵是秩不足(或称为“欠秩”)的。
设A是一组向量,定义A的极大无关组中向量的个数为A的秩。
定义1. 在m*n矩阵A中,任意决定α行和β列交叉点上的元素构成A的一个k阶子矩阵,此子矩阵的行列式,称为A的一个k阶子式。
例如,在阶梯形矩阵中,选定1,3行和3,4列,它们交叉点上的元素所组成的2阶子矩阵的行列式 就是矩阵A的一个2阶子式。
定义2. A=(aij)m×n的不为零的子式的最大阶数称为矩阵A的秩,记作rA,或rankA或R(A)。
特别规定零矩阵的秩为零。
显然rA≤min(m,n) 易得:
若A中至少有一个r阶子式不等于零,且在r<min(m,n)时,A中所有的r+1阶子式全为零,则A的秩为r。
由定义直接可得n阶可逆矩阵的秩为n,通常又将可逆矩阵称为满秩矩阵, det(A)≠0;不满秩矩阵就是奇异矩阵,det(A)=0。
由行列式的性质知,矩阵A的转置AT的秩与A的秩是一样的,即rank(A)=rank(AT)。 [2] 
矩阵的秩
定理:矩阵的行秩,列秩,秩都相等。
定理:初等变换不改变矩阵的秩。
定理:如果A可逆,则r(AB)=r(B),r(BA)=r(B)。
定理:矩阵的乘积的秩Rab<=min{Ra,Rb};
引理:设矩阵A=(aij)sxn的列秩等于A的列数n,则A的列秩,秩都等于n。
当r(A)<=n-2时,最高阶非零子式的阶数<=n-2,任何n-1阶子式均为零,而伴随阵中的各元素就是n-1阶子式再加上个正负号,所以伴随阵为0矩阵。
当r(A)<=n-1时,最高阶非零子式的阶数<=n-1,所以n-1阶子式有可能不为零,所以伴随阵有可能非零(等号成立时伴随阵必为非零)。

3 高斯消元法 Gauss Elimination


要确定任意矩阵秩的大小,我们可以先用高斯消元法将矩阵变换为梯形矩阵。矩阵的秩数就是梯形矩阵中不为零的行数。这是因为行变换不会改变矩阵的秩。
证明:如果通过行变换可以把矩阵的某行变为零,那么就说明该行必定可以表示为其他行的线性组合;而梯形矩阵中每一个不为零的行都无法通过行变换变为零,所以他们都是线性无关的(具体证明留作习题)。证毕。
 

using System;

namespace Zhou.CSharp.Algorithm
{
    /// <summary>
    /// 矩阵类
    /// 作者:周长发
    /// 改进:深度混淆
    /// https://blog.csdn.net/beijinghorn
    /// </summary>
    public partial class Matrix
    {
        /// <summary>
        /// 求矩阵秩的全选主元高斯消去法
        /// </summary>
        /// <param name="src">源矩阵</param>
        /// <returns>矩阵的秩</returns>
        public static int ComputeRankGauss(Matrix src)
        {
            int i, j, k, nn, nis = 0, js = 0, z, zz, u, v;
            double q, d;

            // 秩小于等于行列数
            nn = src.Rows;
            if (src.Rows >= src.Columns)
            {
                nn = src.Columns;
            }
            k = 0;

            // 消元求解
            for (z = 0; z <= nn - 1; z++)
            {
                q = 0.0;
                for (i = z; i <= src.Rows - 1; i++)
                {
                    for (j = z; j <= src.Columns - 1; j++)
                    {
                        zz = i * src.Columns + j;
                        d = Math.Abs(src[zz]);
                        if (d > q)
                        {
                            q = d;
                            nis = i;
                            js = j;
                        }
                    }
                }

                if (Math.Abs(q) < float.Epsilon)
                {
                    return (k);
                }
                k = k + 1;
                if (nis != z)
                {
                    for (j = z; j <= src.Columns - 1; j++)
                    {
                        u = z * src.Columns + j;
                        v = nis * src.Columns + j;
                        d = src[u];
                        src[u] = src[v];
                        src[v] = d;
                    }
                }
                if (js != z)
                {
                    for (i = z; i <= src.Rows - 1; i++)
                    {
                        u = i * src.Columns + js;
                        v = i * src.Columns + z;
                        d = src[u];
                        src[u] = src[v];
                        src[v] = d;
                    }
                }

                zz = z * src.Columns + z;
                for (i = z + 1; i <= src.Columns - 1; i++)
                {
                    d = src[i * src.Columns + z] / src[zz];
                    for (j = z + 1; j <= src.Columns - 1; j++)
                    {
                        u = i * src.Columns + j;
                        src[u] = src[u] - d * src[z * src.Columns + j];
                    }
                }
            }

            return (k);
        }
    }
}

POWER BY 315SOFT.COM & TRUFFER.CN

4 矩阵秩的求解方法

矩阵秩的求法很多,一般归结起来有以下几种:

  • 通过对矩阵做初等变换(包括行变换以及列变换)化简为梯形矩阵求秩。此类求解一般适用于矩阵阶数不是很大的情况,可以精确确定矩阵的秩,而且求解快速比较容易掌握。
  • 通过矩阵的行列式,由于行列式的概念仅仅适用于方阵的概念。通过行列式是否为0则可以大致判断出矩阵是否是满秩。
  • 对矩阵做分块处理,如果矩阵阶数较大时将矩阵分块通过分块矩阵的性质来研究原矩阵的秩也是重要的研究方法。此类情况一般也是可以确定原矩阵秩的。
  • 对矩阵分解,此处区别与上面对矩阵分块。例如n阶方阵A,R分解(Q为正交阵,R为上三角阵)以及Jordan分解等。通过对矩阵分解,将矩阵化繁为简来求矩阵的秩也会有应用。
  • 对矩阵整体做初等变换(行变换为左乘初等矩阵,列变换为右乘初等矩阵)。此类情况多在证明秩的不等式过程有应用,技巧很高与前面提到的分块矩阵联系密切。

(本小节原文来自 https://blog.csdn.net/edward_zcl/article/details/90177159)

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

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

相关文章

全面解析反欺诈(羊毛盾)API,助你识别各类欺诈风险

前言 反欺诈&#xff08;羊毛盾&#xff09;反机器欺诈 API&#xff0c;是一种基于大数据分析和模型产品的技术&#xff0c;通过输入手机号、手机 IP 地址进行检测&#xff0c;帮助客户识别大量存在恶意的账号。 反欺诈&#xff08;羊毛盾&#xff09;API 的作用 反欺诈&…

Spring自定义参数解析器~

1. 什么是参数解析器 RequstBody、RequstParam 这些注解是不是很熟悉&#xff1f; 我们在开发 Controller 接口时经常会用到此类参数注解&#xff0c;那这些注解的作用是什么&#xff1f;我们真的了解吗&#xff1f; 简单来说&#xff0c;这些注解就是帮我们将前端传递的参数…

基于Sikuli GUI图像识别框架的PC客户端自动化测试实践

目录&#xff1a;导读 引言 一、GUI图像识别框架元祖&#xff1a;Sikuli 二、Sikuli运行原理 三、Sikuli安装 四、Sikuli IDE主界面基本使用 五、Sikuli 脚本语法 六、Sikuli 应用示例 七、Sikuli 优势及局限 1.优势 2.局限 Sikuli 使用小结 引言 Sikuli是一种基于…

【Hello Network】网络基础1

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍网络的基础概念 网络基础1网络基础网络的起源网络在哪里认识协议网络协议协议分层OSI七层模型TCP/IP协议网络传输流程局域网的两台主机通信两…

跟姥爷深度学习3 神经网络的调试实操

一、前言 前面我们做了一次天气预测的模型&#xff0c;训练的结果都还好&#xff0c;网络好歹是“拟合”了&#xff0c;但预测数据不合预期让我一直耿耿于怀。所以我又花了很长时间来研究为什么&#xff0c;我的理论依据明明没有问题&#xff08;今日*均温度与*一周*均温度具有…

全球6G技术大会总结报告

全球6G技术大会 论坛B&#xff1a;天地融合智能组网技术 论坛D&#xff1a;2030技术发展趋势 论坛E&#xff1a;6G无线空口传输技术 论坛F&#xff1a;6G通感算架构及关键技术 论坛H&#xff1a;6G网络架构及关键技术 论坛B&#xff1a;天地融合智能组网技术 论坛B中包含…

【Java 并发编程】一文了解线程间有哪些通信方式?

一文了解线程间有哪些通信方式&#xff1f;1. synchronized 内置锁2. volatile 关键字3. 等待/通知机制3.1 等待wait()wait(long)wait(long, int)等待方需遵循如下原则3.2 通知notify()notifyAll()通知方需遵循如下原则notify() 和 notifyAll() 应该用谁&#xff1f;4. 管道输入…

第18章_JDK8-17新特性(下)

第18章_JDK8-17新特性&#xff08;下&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 6. 新语法结构 新的语法结构&#xff0c;为我们勾勒出了 Java 语法进化的一个趋势&#xff0c…

STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别

问题&#xff1a;当我使用STM32库函数对 I/O 口进行赋值时&#xff0c;在头文件中发现有四个相关的函数可以做这个操作&#xff0c;那么它们有什么区别呢&#xff1f; 一、GPIO_SetBits //eg: GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);解释&#xff1a;置位(置1)选择的数…

十、市场活动-分页查询

功能需求 ①、当市场活动主页面加载完成之后,显示所有数据的第一页; ②、用户在市场活动主页面填写查询条件,点击"查询"按钮,显示所有符合条件的数据的第一页&#xff0c;保持每页显示条数不变 ③、实现翻页功能. *在市场活动主页面,显示市场活动列表和记录的总条…

Spring MVC(Boot) Servlet 3.0异步处理,DeferredResult和Callable(续篇)

目录背景意外发现结论背景 上篇Spring MVC(Boot) Servlet 3.0异步处理&#xff0c;DeferredResult和Callable&#xff0c;我把WebMvcConfig 代码加入项目后&#xff0c;会报冲突的问题。如下所示。 requestMappingHandlerMapping: defined by method ‘requestMappingHandlerM…

The 1st Universal Cup Stage 12: ̄Ookayama, April 15-16, 2023 题解

A XOR Tree Path 给一颗树&#xff0c;树上点有黑白两色&#xff0c;每次可以选一个叶子节点&#xff0c;翻转其到根路径上所有点的颜色&#xff0c;问最大黑色点数。 树dp #include<bits/stdc.h> using namespace std; #define MAXN (10000010) #define ll long long…

计及氢能的综合能源优化调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用国密SSL证书,实现SSL/TLS传输层国密改造

密码是保障网络空间安全可信的核心技术和基础支撑&#xff0c;通过自主可控的国产密码技术保护重要数据的安全&#xff0c;是有效提升我国信息安全保障水平的重要举措。因此&#xff0c;我国高度重视商用密码算法的应用并出台相关政策法规&#xff0c;大力推动国产商用密码算法…

.Net MVC中 视图如何使用路由!!!

配置路由 app.UseEndpoints(endpoints > { endpoints.MapControllerRoute( name: "default", pattern: "{controllerHome}/{actionIndex}/{id?}"); }); 在视图中使用路由 页面跳转常用的路由设置 标签属性 描述 asp-action 指定…

STL容器总结

1.Vector&#xff1a; 本质是动态数组&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变&#xff0c;能非常好的支持随机存取&#xff0c;即[]操作符&#xff0c;但由于它的内存空间是连续的&#xff0c;所以在中间进行插入和删除会造成内存块的拷贝&#xff0c…

C++之 文件操作(file operation)

目录 引言 一、文本文件 1、写文件 2、读文件 二、二进制文件 1、写文件 2、读文件 引言 程序运行时产生的数据属于临时数据&#xff0c;程序一旦运行结束后&#xff0c;数据也会被释放 通过文件可以将数据保存以持久化 在C中&#xff0c;对文件进行操作要写头文件<f…

图染色问题的NP完全性证明

文章目录1.Overview2.CNF 3-sat3. Gadgets3.1 Concolorous Edges3.2 Starter/Variable Gadget3.3 Splitter Gadget3.4 OR Gadget3.5 Clause Gadget4. To Planar Graph最近在学 6.890&#xff0c;然后 devans 刚好问了我这个问题&#xff0c;然后尝试编了一个证明。 1.Overview…

功能测试面试没人要了!软件自动化测试如何入门?

对于我来说&#xff0c;我做的是web端的测试&#xff0c;做测试也有好几个年头了&#xff0c;每次都是使用手工测试的话&#xff0c;一直是做重复性的工作&#xff0c;既枯燥又繁琐&#xff0c;所以我在两年前自己使用java语言写了一系列的自动化测试脚本&#xff0c;利用的框架…

Java数据结构与算法----动态规划(背包篇)

1. 0/1背包 1.1.算法思路 0/1背包是动态规划、背包问题中最经典的问题啦&#xff01;它主要的问题是&#xff1a; 给定n种物品、这n种物品的重量分别是&#xff0c;价值分别是 &#xff0c;而你有一个容量为C的背包&#xff0c;请问如何求出所能拿的最大价值呢&#xff1f; …