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

news2024/12/28 22:05:26

程序框架及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://www.coloradmin.cn/o/1666717.html

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

相关文章

Oracle数据库之 常用数据库对象(二)

目录 1.视图 1.1.什么是视图&#xff1f; 1.2.创建视图的语法 1.3.简单视图和复杂视图 1.4.创建复杂视图 1.4.1.创建复杂视图的步骤 1.4.2.示例 1.4.3.注意事项 1.5.视图中使用DML的规定 1.5.1.屏蔽DML操作 1.6.删除视图 2.序列 2.1.语法&#xff1a; 2.2.查询序…

【AI源码】音频和图片生成你的数字人口播

带表情、带头部运动。适合做一些名人短视频鸡汤口播 类似此前微软和阿里emo那个方案 1、介绍: 能够通过单张静态肖像和输入音频生成具有自然流动运动的谈话视频,它采用了一种普遍的运动表示方法,能够捕捉广泛的面部动态,包括细微的表情和头部运动。 2、框架概述 (1)该…

【18-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

信息检索(37):Query-as-context Pre-training for Dense Passage Retrieval

Query-as-context Pre-training for Dense Passage Retrieval 标题摘要1 引言2 初步&#xff1a;上下文监督预训练2.1 coCondenser2.2 CoT-MAE 3 查询即上下文预训练3.1 预训练3.2 微调 4 实验4.1 预训练4.2 微调4.3 基线4.4 主要结果4.5 域外评估 5 分析5.1 生成的查询数量的影…

【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…

【一支射频电缆的诞生】GORE 戈尔

工具连接&#xff1a; https://microwave-cablebuilder.gore.com/ 控制参数&#xff1a; 连接器&#xff1a; 欣赏

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

力扣每日一题124:二叉树中的最大路径和

题目 困难 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root…

Python 将Excel转换为多种图片格式(PNG, JPG, BMP, SVG)

目录 安装Python Excel库 使用Python将Excel工作表转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel特定单元格区域转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel工作表转换为SVG图片 有时&#xff0c;你可能希望以图片形式分享Excel数据&#xff0c;以防止他…

视频封面一键提取:从指定时长中轻松获取您想要的帧图片

在数字媒体时代&#xff0c;视频已成为人们获取信息、娱乐和沟通的主要形式之一。而一个好的视频封面&#xff0c;往往能够吸引观众的眼球&#xff0c;增加视频的点击率和观看量。然而&#xff0c;对于很多视频创作者和编辑者来说&#xff0c;如何从视频中快速、准确地提取出合…

时序分解 | Matlab实现LMD局域均值分解

时序分解 | Matlab实现LMD局域均值分解 目录 时序分解 | Matlab实现LMD局域均值分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序分解 | Matlab实现LMD局域均值分解 Matlab语言 1.算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图 2.直接替换数据即可用…

进入泛型的世界

泛型的理解和好处 泛型的好处 编译时&#xff0c;检查添加元素的类型&#xff0c;提高了安全性减少了类型转换的次数&#xff0c;提高效率 不使用泛型 Dog-加入->Object-取出->Dog&#xff08;向下转型&#xff09; Dog放入到ArrayList 会先转成Object&#xff0c;在转…

数据分享—中国土壤有机质数据

土壤有机质数据是进行区域土地资源评价&#xff0c;开展自然地理研究常使用的数据&#xff0c;本期推文主要分享全国土壤有机质数据集。梧桐君会不定期分享地理信息数据&#xff0c;欢迎大家长期订阅。 数据来源 “万物土中生”&#xff0c;小编今天要分享的中国土壤有机质数…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

安装Ununtu后常见问题(无法远程连接、root密码等)

安装Ununtu后常见问题&#xff08;无法远程连接、root密码、无法ifconfig等&#xff09; 提示&#xff1a;安装完Ununtu系统后会遇到一些常见的问题&#xff0c;本文一次洗解决 文章目录 安装Ununtu后常见问题&#xff08;无法远程连接、root密码、无法ifconfig等&#xff09;一…

【全开源】排队叫号系统基于FastAdmin+GatewayWorker(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 功能简介…

全国招标信息招标原文查询接口

招标信息招标原文查询接口 避开会员 全国招标投标查询API是解析商机的数据之门&#xff0c;它提供了一个高效、实时且定制化的方式来获取和分析招标投标信息。无论您是一家小型企业还是一家大型企业&#xff0c;都可以受益于这一强大工具&#xff0c;加速商业决策&#xff0c;…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1&#xff1a;H264语法结构回顾 2&#xff1a;H264编码补充介绍 3&#xff1a;MP4模式转Annex B模式输出到文件示例 1&#xff1a;H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2&#xff1a;H264编码补充介绍 H…

内存操作数及寻址方式

debug命令 debug命令&#xff0c;即DOS实用程序。DEBUG是一个DOS实用程序&#xff0c;是供程序员使用的程序调试工具&#xff0c;可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性&#xff0c;也可以追踪执行过程…