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

这篇具有很好参考价值的文章主要介绍了C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

determinant矩阵,C#算法演义 Algorithm Recipes,C#数值计算 Numerical Recipes,线性代数,矩阵行列式,伴随矩阵,矩阵求逆

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

determinant矩阵,C#算法演义 Algorithm Recipes,C#数值计算 Numerical Recipes,线性代数,矩阵行列式,伴随矩阵,矩阵求逆

一、矩阵的行列式(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文章来源地址https://www.toymoban.com/news/detail-829520.html

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();
}

到了这里,关于C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线代:认识行列式、矩阵和向量

    本文主要参考的视频教程如下: 8小时学完线代【中国大学MOOC*小元老师】线性代数速学_哔哩哔哩_bilibili 另外这个视频可以作为补充: 【考研数学 线性代数 基础课】—全集_哔哩哔哩_bilibili 一般会由方程组来引出行列式 比如一个二阶行列式 二阶行列式的计算就是主对角线的

    2024年02月19日
    浏览(48)
  • 方阵行列式与转置矩阵

    1.转置矩阵:格式规定:如果矩阵A为n阶方阵,那么A的T次方为矩阵A的转置矩阵,即将矩阵A的行与列互换。 2.转置矩阵的运算性质:         1.任何方阵的转置矩阵的转置矩阵为方阵自身。         2.多个矩阵的和的转置矩阵等于多个转置矩阵的和,         3.k倍矩阵A的转置

    2024年02月06日
    浏览(50)
  • 【线性代数】一、行列式和矩阵

    ∣ A B ∣ = ∣ A ∣ ∣ B ∣ |AB|=|A||B| ∣ A B ∣ = ∣ A ∣ ∣ B ∣ 行列互换其值不变, ∣ A T ∣ = ∣ A ∣ |A^T|=|A| ∣ A T ∣ = ∣ A ∣ ∣ A ∗ ∣ = ∣ A ∣ n − 1 ( 由 A A ∗ = ∣ A ∣ E 推 导 而 来 ) |A^*|=|A|^{n-1}(由AA^*=|A|E推导而来) ∣ A ∗ ∣ = ∣ A ∣ n − 1 ( 由 A A ∗ = ∣ A ∣ E 推 导 而

    2024年02月05日
    浏览(54)
  • python如何算矩阵的行列式

    在 Python 中,可以使用 NumPy 库中的 linalg.det() 函数来计算矩阵的行列式。例如,假设你要计算以下矩阵的行列式: $$A=begin{bmatrix}1 2 34 5 67 8 9end{bmatrix}$$ 你可以使用 NumPy 库来计算它的行列式,方法如下: 运行上面的代码后,将输出矩阵 A 的行列式的值,即: 注意,如果矩阵

    2024年02月12日
    浏览(55)
  • 线代第二章 矩阵 +行列式与矩阵的区别

    行列式与矩阵的区别 一、 行列式是一个数,矩阵是一个表格。 (行列式都是n阶的方阵,但矩阵不一定是方阵An×n,也可以是Am×n) 只有n阶矩阵An×n:才有对应的行列式|A|,才能计算对应行列式的模。 二、 行列式的性质:    P201 行列式的某行(或列)有公因子k,则可把k提出

    2023年04月08日
    浏览(46)
  • 利用python求行列式、矩阵的秩和逆

    相关线性代数知识,自行百度!!!

    2024年02月13日
    浏览(48)
  • Markdown:常用公式、行列式、矩阵、方程组等

        当前整理出来的皆为实际使用过的,欢迎大佬路过补充说明或者指正错误点。无用请轻喷。 1.1 常用公式符号 1.1.1 上下标 显示效果 公式代码 描述 x y x^y x y $x^y$ 或 $x^{y}$ 上标,若独显一个上标直接用 ^ ,若需要实现: x x + y x^{x+y} x x + y ,则用 {} 即可 x y x_y x y ​ $

    2024年02月05日
    浏览(42)
  • 矩阵行列式的按行按列展开复习

    1,行列式按某一行(列)展开 例如: 按元素5展开 则去掉所在行,所在列得到, 这样5的变成由3阶变成2阶行列式 5的行列式比较好算 这个叫做的余子式 称为 它的代数余子式为  ,代数余子式与余子式区别是前面多一个符号是(-1)该行该列之和 D= 按第二行展开    +  +   = 24 - 60 + 36

    2024年02月11日
    浏览(65)
  • 证明矩阵特征值之积等于矩阵行列式的值

    设n阶矩阵 A A A 的特征值为 λ 1 , λ 2 , . . , λ n lambda_1, lambda_2,..,lambda_n λ 1 ​ , λ 2 ​ , .. , λ n ​ ,则 λ 1 λ 2 ⋯ λ n = ∣ A ∣ 。 lambda_1lambda_2cdotslambda_n = |A|。 λ 1 ​ λ 2 ​ ⋯ λ n ​ = ∣ A ∣ 。 证明: 矩阵 A A A 的特征多项式为: f ( λ ) = ∣ λ E − A ∣ = ∣ λ − a 11 −

    2024年02月16日
    浏览(44)
  • 线性代数(基础篇):第一章:行列式 、第二章:矩阵

    1. A可逆 ⇦⇨①|A|≠0 ⇦⇨②r(A)=n,A满秩 ⇦⇨③A的列向量 α₁,α₂,…α n 线性无关 ⇦⇨④Ax=0仅有零解 (系数矩阵的秩 = 列数,列满秩) ⇦⇨⑤ A的特征值均不为0 【17年5.】 2.  A不可逆 ⇦⇨①|A|=0 ⇦⇨②r(A)n,A不满秩 ⇦⇨③A的列向量 α₁,α₂,…α n 线性相关 ⇦⇨④Ax=0有非

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包