C#二维数组(矩阵)求伴随矩阵和逆矩阵

程序框架及winform窗体

窗体控件: 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Matrix
{internal class Algorithm_Gallery{// <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){//从一个给定的二维数组(matrix)中提取除了第p行和第q列之外的所有元素,并将这些元素填充到另一个二维数组(temp)中if (temp.GetLength(0) != n - 1 || temp.GetLength(1) != n - 1)//temp数组应该是一个(n-1) * (n-1)的二维数组{throw new ArgumentException("The size of temp array is not (n-1) x (n-1).");}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];//如果当前遍历的行不是第p行且列不是第q列,则将matrix中的该元素赋值给temp。if (j == (n - 1)){j = 0;i++;//每当列索引j等于n-1时(即到达当前行的最后一个位置),重置j为0并将i加1,以便在下一行开始填充元素}}}}}/// <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){//计算一个给定二维数组(matrix)的行列式(determinant)if (n == 1){return matrix[0, 0];}double D = 0.0;double[,] temp = new double[n-1, n-1];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>/// 伴随矩阵/// </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-1, N-1];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="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;}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();}}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Matrix
{public partial class Form1 : Form{public Form1(){InitializeComponent();}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[,] b = new double[3, 3] { { 1, 2, 3 }, { 0, 1, 4 }, { 5, 6, 0 } };double d = Algorithm_Gallery.Determinant(0, b, 3);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();}}
}

运行--点击button1:

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

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

相关文章

STL——deque容器【双端动态数组】

deque容器的基本概念&#xff1a; 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector的区别&#xff1a; vector队友头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度会比vecto…

面试官:SPA(单页应用)首屏加载速度慢怎么解决

一、什么是首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是…

喜报|才聚荣获“2024年度PMI(中国)注册教育机构杰出机构奖”!

5月10日&#xff0c;“2024PMI&#xff08;中国&#xff09;注册教育机构合作伙伴大会”隆重举行&#xff0c;才聚集团受邀参加此次盛会。 本次大会就项目管理职业生态、发展趋势等热门问题进行了深入探讨分析。 PMP认证自1999年引入中国&#xff0c;为国家培养了大量项目管理…

单细胞分析:多模态 reference mapping (2)

引言 本文[1]介绍了如何在Seurat软件中将查询数据集与经过注释的参考数据集进行匹配。我们展示了如何将来自不同个体的人类骨髓细胞&#xff08;Human BMNC&#xff09;的人类细胞图谱&#xff08;Human Cell Atlas&#xff09;数据集&#xff0c;有序地映射到一个统一的参考框…

总结 UDP 的报文结构和注意事项

UDP协议端格式 UDP报文主体分为两个部分:UDP报头(占8个字节)UDP数据/UDP载荷UPD报头:源端口号目的端口号包长度校验和 1.源端口号&#xff1a;一般是客户端程序程序请求时&#xff0c;由系统自动指定&#xff0c;端口号范围是0~65535&#xff0c; 0 ~ 1023为知名端口号——占16…

算法练习day7

四数相加II 代码随想录 0454.四数相加II 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.5小时&#xff09; 思路 本道题是需要在四个数组中&#xff0c;各找一个数&#xff0c;这些数加起来能够等于0&#xff0c;那么就是答案元…

slambook2,ch7编译问题

系统环境 ubuntu18&#xff0c;opencv就是默认和ros一起安装的版本,opencv3.2&#xff0c;sophus模板类和非模板类都安装了。 报错信息 主要的原因就是&#xff1a;里面的代码用的是模板类的sophus库&#xff0c;而我安装模板类sophus的时候没有像这篇博客一样Sophus库安装和…

璩静也是受害者

5月7日&#xff0c;“百度副总裁璩静称员工闹分手提离职秒批”话题登上了热搜。在短视频里&#xff0c;璩静是会连续出差50天的“公关人”&#xff0c;没有春节周末、没有假期&#xff0c;她会说“员工闹分手提离职我秒批&#xff0c;为什么要考虑员工的家庭”。有网友对其视频…

JWT生成RSA密钥文档

JWT生成RSA密钥文档 创建jwt文件夹 创建jwt文件夹 进入文件夹 进入jwt文件夹&#xff0c;输入cmd&#xff0c;如图 3、生成公钥私钥 keytool -genkeypair -alias pdm -keyalg RSA -keypass Gacrnd#123 -keystore pdm.jks -storepass Gacrnd#123 -alias&#xff1a;密钥的别名…

VMware虚拟机中ubuntu使用记录(8)—— 如何在Ubuntu18.04中安装运行非ROS版本的ORB_SLAM3跑官方数据集(全程手把手教学安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ORB_SLAM3的介绍一、gitee下载ORB_SLAM3源码1. gitee导入gitHub仓库 二、安装支持C特性依赖三、安装Pangolin1. 安装Pangolin的依赖2. 下载编译 四、安装Eigen31.下…

ChatGPT未来可能应用于iPhone?

苹果接即将与OpenAI达成协议 ChatGPT未来应用于iPhone 前言 就在5月11日&#xff0c;苹果公司正与OpenAI进行深入讨论&#xff0c;计划在其最新的iOS操作系统中整合OpenAI的先进技术。这一举措是苹果公司在为其产品线融入更先进的人工智能功能所做努力的一部分。 目前情况双方…

全网最详细IOS系统APP上架教程(二)

上一篇讲解了IOS系统APP上架注册苹果开发者账号需要的材料、邓白氏编码的注册等&#xff0c;本文将继续讲解后续流程。 详细步骤 三、申请苹果开发者账号 在苹果手机上安装Apple Developer 打开Apple Developer&#xff0c;用之前注册好的Apple ID登录&#xff0c;输入姓名身…

收音机套件焊接和装调的总结

很早之前买了一个小收音机&#xff0c;今天翻出来焊接上。 还好&#xff0c;质量挺好的&#xff0c;电路板没有氧化。 一。静态电流 pcb上面留有ABCD四个测电流的位置。方便调试。 焊接后&#xff0c;V1电流偏大&#xff0c;如果电流过大&#xff0c;会导致R2的压降过大&am…

基于SpringBoot+Vue的笔记共享平台 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;10张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&#…

机器人系统ros2-开发实践08-了解如何使用 tf2 来访问坐标帧转换(Python)

tf2 库允许你在 ROS 节点中查询两个帧之间的转换。这个查询可以是阻塞的&#xff0c;也可以是非阻塞的&#xff0c;取决于你的需求。下面是一个基本的 Python 示例&#xff0c;展示如何在 ROS 节点中使用 tf2 查询帧转换。 本教程假设您已完成tf2 静态广播器教程 (Python)和tf…

STM32(六):定时器PWM呼吸灯 (标准库函数)

前言 上一篇文章已经介绍了如何用STM32单片机中的TIMER定时器来控制LED灯的交替闪烁&#xff0c;实现了点灯的第五种方式。这篇文章我们来介绍一下如何用STM32单片机中的定时器的PWM波来实现LED的“呼吸”。 一、实验原理 关于定时器这边就不多加赘述&#xff0c;详细请看上…

selenium进行xhs图片爬虫:03获取一篇图文的图片

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

如何选择合适加密软件来保护信息资产|精选加密软件分析

五款加密软件对比分析&#xff0c;是一项复杂而必要的任务&#xff0c;旨在帮助用户选择最适合其需求的加密工具。在数字化时代&#xff0c;信息安全显得尤为重要&#xff0c;因此&#xff0c;对加密软件的评估与比较显得尤为关键。 首先&#xff0c;我们要考虑的是这些加密软件…

小程序分包

上传时主包不能过大&#xff0c;采用分包的方式&#xff0c;这里是taro框架 要访问的话

飞跨电容型的三电平(FC-NPC)逆变器simulink仿真模型

本人搭建了飞跨电容型的三电平逆变器simulink仿真模型&#xff0c;相较于二极管钳位型三电平逆变器而言&#xff0c;钳位二极管变为飞跨的电容。采用SPWM调制和均流均压控制&#xff0c;通过搭建仿真模型得到三电平波形。 三电平拓扑中的飞跨电容是指在电路的输出端使用电容来实…