C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码

本文发布矩阵(Matrix)的一些初级算法。

一、矩阵的行列式(Determinant)

矩阵行列式是指矩阵的全部元素构成的行列式,设A=(a)是数域P上的一个n阶矩阵,则所有A=(a)中的元素组成的行列式称为矩阵A的行列式,记为|A|或det(A)。若A,B是数域P上的两个n阶矩阵,k是P中的任一个数,则|AB|=|A||B|,|kA|=kⁿ|A|,|A*|=|A|,其中A*是A的伴随矩阵;若A是可逆矩阵,则|A|=|A|。
 

/// <summary>
/// 计算 A[p,q] 位于 [,]temp 的块辅因子
/// </summary>
/// <param name="matrix"></param>
/// <param name="temp"></param>
/// <param name="p"></param>
/// <param name="q"></param>
/// <param name="n"></param>
private static void BlockCofactor(double[,] matrix, ref double[,] temp, int p, int q, int n)
{
    int i = 0;
    int j = 0;

    for (int row = 0; row < n; row++)
    {
        for (int col = 0; col < n; col++)
        {
            if (row != p && col != q)
            {
                temp[i, j++] = matrix[row, col];
                if (j == (n - 1))
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}

/// <summary>
/// 求矩阵行列式(递归算法)
/// </summary>
/// <param name="N"></param>
/// <param name="matrix"></param>
/// <param name="n"></param>
/// <returns></returns>
public static double Determinant(int N, double[,] matrix, int n)
{
    if (n == 1)
    {
        return matrix[0, 0];
    }

    double D = 0.0;
    double[,] temp = new double[N, N];
    int sign = 1;
    for (int f = 0; f < n; f++)
    {
        BlockCofactor(matrix, ref temp, 0, f, n);
        D += sign * matrix[0, f] * Determinant(N, temp, n - 1);
        sign = -sign;
    }
    return D;
}
 

/// <summary>
/// 计算 A[p,q] 位于 [,]temp 的块辅因子
/// </summary>
/// <param name="matrix"></param>
/// <param name="temp"></param>
/// <param name="p"></param>
/// <param name="q"></param>
/// <param name="n"></param>
private static void BlockCofactor(double[,] matrix, ref double[,] temp, int p, int q, int n)
{int i = 0;int j = 0;for (int row = 0; row < n; row++){for (int col = 0; col < n; col++){if (row != p && col != q){temp[i, j++] = matrix[row, col];if (j == (n - 1)){j = 0;i++;}}}}
}/// <summary>
/// 求矩阵行列式(递归算法)
/// </summary>
/// <param name="N"></param>
/// <param name="matrix"></param>
/// <param name="n"></param>
/// <returns></returns>
public static double Determinant(int N, double[,] matrix, int n)
{if (n == 1){return matrix[0, 0];}double D = 0.0;double[,] temp = new double[N, N];int sign = 1;for (int f = 0; f < n; f++){BlockCofactor(matrix, ref temp, 0, f, n);D += sign * matrix[0, f] * Determinant(N, temp, n - 1);sign = -sign;}return D;
}

二、矩阵的伴随矩阵(Adjoint Matrix)

一个方形矩阵的伴随矩阵是一个类似于逆矩阵的概念。如果二维矩阵可逆,那么它的逆矩阵和它的伴随矩阵之间只差一个系数,对多维矩阵也存在这个规律。然而,伴随矩阵对不可逆的矩阵也有定义,并且不需要用到除法。
 

/// <summary>
/// 伴随矩阵
/// </summary>
/// <param name="A"></param>
/// <param name="adj"></param>
public static void Adjoint(double[,] matrix, out double[,] adjoint)
{
    int N = matrix.GetLength(0);
    adjoint = new double[N, N];

    if (N == 1)
    {
        adjoint[0, 0] = 1.0;
        return;
    }

    int sign = 1;
    double[,] temp = new double[N, N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            BlockCofactor(matrix, ref temp, i, j, N);
            sign = ((i + j) % 2 == 0) ? 1 : -1;
            adjoint[j, i] = (sign) * (Determinant(N, temp, N - 1));
        }
    }
}

/// <summary>
/// 伴随矩阵
/// </summary>
/// <param name="A"></param>
/// <param name="adj"></param>
public static void Adjoint(double[,] matrix, out double[,] adjoint)
{int N = matrix.GetLength(0);adjoint = new double[N, N];if (N == 1){adjoint[0, 0] = 1.0;return;}int sign = 1;double[,] temp = new double[N, N];for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){BlockCofactor(matrix, ref temp, i, j, N);sign = ((i + j) % 2 == 0) ? 1 : -1;adjoint[j, i] = (sign) * (Determinant(N, temp, N - 1));}}
}

三、矩阵的逆矩阵(Inverse Matrix)

设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵。矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。

/// <summary>
/// 矩阵求逆
/// </summary>
/// <param name="A"></param>
/// <param name="inverse"></param>
/// <returns></returns>
public static bool Inverse(double[,] matrix, out double[,] inverse)
{
    int N = matrix.GetLength(0);
    inverse = new double[N, N];

    double det = Determinant(N, matrix, N);
    if (det == 0)
    {
        return false;
    }

    Adjoint(matrix, out double[,] adj);

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            inverse[i, j] = adj[i, j] / (double)det;
        }
    }
    return true;
}
 

/// <summary>
/// 矩阵求逆
/// </summary>
/// <param name="A"></param>
/// <param name="inverse"></param>
/// <returns></returns>
public static bool Inverse(double[,] matrix, out double[,] inverse)
{int N = matrix.GetLength(0);inverse = new double[N, N];double det = Determinant(N, matrix, N);if (det == 0){return false;}Adjoint(matrix, out double[,] adj);for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){inverse[i, j] = adj[i, j] / (double)det;}}return true;
}

演算代码:

private void button1_Click(object sender, EventArgs e)
{
    double[,] A = { 
        {5, -2, 2, 7},
        {1, 0, 0, 3},
        {-3, 1, 5, 0},
        {3, -1, -9, 4}
    };

    double d = Algorithm_Gallery.Determinant(4, A, 4);

    StringBuilder sb = new StringBuilder();
    sb.Append(Welcome());
    sb.AppendLine("1、<b>原始矩阵</b>(Source Matrix):<br>");
    sb.Append(Algorithm_Gallery.ToHtml(A));
    sb.AppendLine("行列式(Determinant)=" + d + "<br>");
    
    Algorithm_Gallery.Adjoint(A, out double[,] adj);
    sb.AppendLine("<br>2、<b>伴随矩阵</b>(Adjoint Matrix):<br>");
    sb.Append(Algorithm_Gallery.ToHtml(adj));
    
    Algorithm_Gallery.Inverse(A, out double[,] inv);
    sb.AppendLine("<br>3、<b>逆矩阵</b>(Inverse Matrix):<br>");
    sb.Append(Algorithm_Gallery.ToHtml(inv));
    sb.Append(Bye());
    webBrowser1.DocumentText = sb.ToString();
}

private void button1_Click(object sender, EventArgs e)
{double[,] A = { {5, -2, 2, 7},{1, 0, 0, 3},{-3, 1, 5, 0},{3, -1, -9, 4}};double d = Algorithm_Gallery.Determinant(4, A, 4);StringBuilder sb = new StringBuilder();sb.Append(Welcome());sb.AppendLine("1、<b>原始矩阵</b>(Source Matrix):<br>");sb.Append(Algorithm_Gallery.ToHtml(A));sb.AppendLine("行列式(Determinant)=" + d + "<br>");Algorithm_Gallery.Adjoint(A, out double[,] adj);sb.AppendLine("<br>2、<b>伴随矩阵</b>(Adjoint Matrix):<br>");sb.Append(Algorithm_Gallery.ToHtml(adj));Algorithm_Gallery.Inverse(A, out double[,] inv);sb.AppendLine("<br>3、<b>逆矩阵</b>(Inverse Matrix):<br>");sb.Append(Algorithm_Gallery.ToHtml(inv));sb.Append(Bye());webBrowser1.DocumentText = sb.ToString();
}

 打印矩阵的代码:


public static string ToHtml(double[,] y)
{
    int m = y.GetLength(0);
    int n = y.GetLength(1);
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("<style>");
    sb.AppendLine("td { padding:5px;text-align:right; }");
    sb.AppendLine("</style>");
    sb.AppendLine("<table width='100%' border=1 bordercolor='#999999' style='border-collapse:collapse;'>");
    for (int i = 0; i < m; i++)
    {
        sb.AppendLine("<tr>");
        for (int j = 0; j < n; j++)
        {
            sb.AppendLine("<td>" + String.Format("{0:F8}", y[i, j]) + "</td>");
        }
        sb.AppendLine("</tr>");
    }
    sb.AppendLine("</table>");
    return sb.ToString();
}
 

————————————————————————————————

POWER BY  TRUFFER.CN 50018.COM 315SOFT.COM

public static string ToHtml(double[,] y)
{int m = y.GetLength(0);int n = y.GetLength(1);StringBuilder sb = new StringBuilder();sb.AppendLine("<style>");sb.AppendLine("td { padding:5px;text-align:right; }");sb.AppendLine("</style>");sb.AppendLine("<table width='100%' border=1 bordercolor='#999999' style='border-collapse:collapse;'>");for (int i = 0; i < m; i++){sb.AppendLine("<tr>");for (int j = 0; j < n; j++){sb.AppendLine("<td>" + String.Format("{0:F8}", y[i, j]) + "</td>");}sb.AppendLine("</tr>");}sb.AppendLine("</table>");return sb.ToString();
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00254】基于Springboot的java学习平台(有论文)

基于Springboot的java学习平台&#xff08;有论文&#xff09;&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的学习平台 本系统分为系统功能模块、管理员功能模块、教师功能模块以及学生功能模块。 系统功能模块&#xff1a;在平台…

线性代数的本质 1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…

OCP使用web console创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 在 crc start 启动crc时&#xff0c;可以看到&#xff1a; .....…

【Django】Django日志管理

Django日志管理 Django使用Python内置的logging模块处理系统日志。 1.日志框架的组成元素 Python logging 配置由下面四部分组成&#xff1a; Loggers Handlers 过滤器 Formatters 1.1 Loggers logger是日志系统的入口&#xff0c;每个 logger都是命名了的 bucket&…

一句话总结Docker与K8S的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念&#xff1a;OCI、CR、Runc、…

从Unity到Three.js(安装启动)

发现在3D数字孪生或模拟仿真方向&#xff0c;越来越多的公司倾向使用Web端程序&#xff0c;目前一直都是使用的Unity进行的Web程序开发&#xff0c;但是存在不少问题&#xff0c;比如内存释放、shader差异化、UI控件不支持复制或输入中文等。虽然大多数问题都可以找到解决方案&…

微信自动预约小程序开发指南:从小白到专家

在数字化时代&#xff0c;预约小程序已成为各类服务行业的必备工具。本文将指导你从零开始&#xff0c;通过第三方小程序制作平台&#xff0c;顺利开发出一款具有预约功能的实用小程序。 第一步&#xff1a;注册登录第三方小程序制作平台 首先&#xff0c;你需要选择一个适合你…

AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

原题链接&#xff1a;https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作&#xff0c;直到所有不小于2的整数都从黑板上移除&#xff1a; 选择…

java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引 首先 pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>applicatio…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

记一次页面接口502问题:“502 Bad Gateway”

接收别人的项目进行迭代&#xff0c;项目部署到服务器上之后&#xff0c;有一个接口数据刷不出来&#xff0c;一直502 后来联想到网关的问题&#xff0c;想通过设置白名单的方式解决&#xff0c;设置之后依旧不行。 查看nginx日志发现报错&#xff1a; *169 connect() failed …

【Git】移除Git中的文件

有的时候需要移除或者更新 Git 中的文件&#xff0c;我们无法直接在远程仓库中移除&#xff0c;移除或者更新操作需要在本地端实现。 1、移除被跟踪文件 当某个文件被添加到暂存区或者本地仓库&#xff0c;此时会被标记为“跟踪状态”&#xff0c;此时 Git 就会代为管理这个文…

【go语言】一个简单HTTP服务的例子

一、Go语言安装 Go语言&#xff08;又称Golang&#xff09;的安装过程相对简单&#xff0c;下面是在不同操作系统上安装Go语言的步骤&#xff1a; 在Windows上安装Go语言&#xff1a; 访问Go语言的官方网站&#xff08;golang.org&#xff09;或者使用国内镜像站点&#xff0…

vue3 腾讯tdesign 后台管理框架的使用

1.介绍 TDesign 是具有包容性的设计体系&#xff0c;它强调为业务提供产品、服务等过程中&#xff0c;追求以人为本、人人受益的包容性&#xff0c;要求搭建过程中&#xff0c;了解业务底层&#xff0c;理解业务场景的多样性&#xff0c;并在繁杂的业务场景中寻找共性和特性&a…

GeoServer 2.11.1升级解决Eclipse Jetty 的一系列安全漏洞问题

Eclipse Jetty 资源管理错误漏洞(CVE-2021-28165) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7656) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7657) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7658) Jetty 信息泄露漏洞(CVE-2017-9735) Eclipse Jetty 安全漏洞(CVE-2022-20…

算法沉淀——分治算法(leetcode真题剖析)

算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式&#xff0c;其核心思想是将一个大问题分解成若干个小问题&a…

Unity笔记:相机移动

基础知识 鼠标输入 在Unity中&#xff0c;开发者在“Edit” > “Project Settings” > “Input Manager”中设置输入&#xff0c;如下图所示&#xff1a; 在设置了Mouse X后&#xff0c;Input.GetAxis("Mouse X")返回的是鼠标在X轴上的增量值。这意味着它会…

Solidworks:从2D走向3D

Sokidworks 的强大之处在于三维实体建模&#xff0c;这个形状看似复杂&#xff0c;实际上只需要拉伸一次&#xff0c;再做一次减法拉伸就行了。第一次做三维模型&#xff0c;费了不少时间才搞明白。 接下来做一个稍微复杂一点的模型&#xff0c;和上面这个操作差不多&#xff0…

LeetCode.144. 二叉树的前序遍历

题目 144. 二叉树的前序遍历 分析 这道题目是比较基础的题目&#xff0c;我们首先要知道二叉树的前序遍历是什么&#xff1f; 就是【根 左 右】 的顺序&#xff0c;然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现…

利用Windows10漏洞破解密码(保姆级教学)

前言: 本篇博客只是技术分享并非非法传播知识,实验内容均是在虚拟机中进行,并非真实环境 正文: 一.windows10电脑密码破解 1)开启windows10虚拟机,停留在这个页面 2&#xff09;按5次Shift键,出现这个粘滞键,如果没有出现的,则说明漏洞已经修复 3)重新启动,在这个页面的时候…