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:

相关推荐

  1. 矩阵C语言)

    2024-05-12 07:32:07       36 阅读
  2. 由特征值特征向量矩阵

    2024-05-12 07:32:07       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 07:32:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 07:32:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 07:32:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 07:32:07       20 阅读

热门阅读

  1. Github2024-05-11 开源项目日报 Top10

    2024-05-12 07:32:07       12 阅读
  2. C语言经典例题-2

    2024-05-12 07:32:07       12 阅读
  3. 算法题① —— 数组专栏

    2024-05-12 07:32:07       12 阅读
  4. 光栅化渲染和物理渲染

    2024-05-12 07:32:07       12 阅读
  5. 代码随想录算法训练营第36期DAY25

    2024-05-12 07:32:07       8 阅读
  6. 设计模式-09 - 享元模式 flyweight pattern

    2024-05-12 07:32:07       8 阅读
  7. Linux权限(二)

    2024-05-12 07:32:07       11 阅读
  8. 数据结构之队列

    2024-05-12 07:32:07       9 阅读
  9. DBSCAN聚类算法

    2024-05-12 07:32:07       12 阅读
  10. WEB前端复习——HTML

    2024-05-12 07:32:07       11 阅读
  11. UML 方法

    2024-05-12 07:32:07       14 阅读
  12. C语言-STM32:初始定时器(通用定时器)

    2024-05-12 07:32:07       9 阅读
  13. Lua 协程池

    2024-05-12 07:32:07       12 阅读