`

矩阵的各种运算(加、减、乘、逆、行列式、转置)的源码(C#)

    博客分类:
  • C#
阅读更多
/// 矩阵的乘
        public bool MatrixMultiply(double[,] a, double[,] b, ref double[,] c)
        {
            if (a.GetLength(1) != b.GetLength(0))
                return false;
            if (a.GetLength(0) != c.GetLength(0) || b.GetLength(1) != c.GetLength(1))
                return false;
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < b.GetLength(1); j++)
                {
                    c[i, j] = 0;
                    for (int k = 0; k < b.GetLength(0); k++)
                    {
                        c[i, j] += a[i, k] * b[k, j];
                    }
                }
            }

            return true;
        }

        /// 矩阵的加
        public bool MatrixAdd(double[,] a, double[,] b, ref double[,] c)
        {
            if (a.GetLength(0) != b.GetLength(0) || a.GetLength(1) != b.GetLength(1)
                || a.GetLength(0) != c.GetLength(0) || a.GetLength(1) != c.GetLength(1))
                return false;
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    c[i, j] = a[i, j] + b[i, j];
                }
            }

            return true;
        }

        /// 矩阵的减
        public bool MatrixSubtration(double[,] a, double[,] b, ref double[,] c)
        {
            if (a.GetLength(0) != b.GetLength(0) || a.GetLength(1) != b.GetLength(1)
                || a.GetLength(0) != c.GetLength(0) || a.GetLength(1) != c.GetLength(1))
                return false;
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    c[i, j] = a[i, j] - b[i, j];
                }
            }

            return true;
        }

        /// 矩阵的行列式的值
        public double MatrixSurplus(double[,] a)
        {
            int i, j, k, p, r, m, n;
            m = a.GetLength(0);
            n = a.GetLength(1);
            double X, temp = 1, temp1 = 1, s = 0,s1 = 0;     
              
            if(n == 2)
            {
                for (i = 0; i < m; i++)
                    for (j = 0; j < n; j++)
                        if ((i + j) % 2 > 0) temp1 *= a[i, j];
                        else temp *= a[i, j];
                X=temp-temp1;
            }
            else
            {
                for (k = 0; k < n; k++)
                {
                    for (i = 0, j = k; i < m && j < n; i++, j++)
                        temp *= a[i, j];
                    if (m - i > 0)
                    {
                        for (p = m - i, r = m - 1; p > 0; p--, r--)
                            temp *= a[r, p - 1];
                    }
                    s += temp;
                    temp = 1;
                }

                for (k = n - 1; k >= 0; k--)
                {
                    for (i = 0, j = k; i < m && j >= 0; i++, j--)
                        temp1 *= a[i, j];
                    if (m - i > 0)
                    {
                        for (p = m - 1, r = i; r < m; p--, r++)
                            temp1 *= a[r, p];
                    }
                    s1 += temp1;
                    temp1 = 1;
                }

                X = s - s1;
            }
            return   X;     
        }    

        /// 矩阵的转置
        public bool MatrixInver(double[,] a, ref double[,] b)
        {
            if (a.GetLength(0) != b.GetLength(1) || a.GetLength(1) != b.GetLength(0))
                return false;
            for (int i = 0; i < a.GetLength(1); i++)
                for (int j = 0; j < a.GetLength(0); j++)
                    b[i, j] = a[j, i];

            return true;
        }

        /// 矩阵的逆
        public bool MatrixOpp(double[,] a, ref double[,] b)
        {
            double X = MatrixSurplus(a);
            if (X == 0) return false;
            X = 1 / X;

            double[,] B = new double[a.GetLength(0), a.GetLength(1)];
            double[,] SP = new double[a.GetLength(0), a.GetLength(1)];
            double[,] AB = new double[a.GetLength(0), a.GetLength(1)];

            for (int i = 0; i < a.GetLength(0); i++)
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    for (int m = 0; m < a.GetLength(0); m++)
                        for (int n = 0; n < a.GetLength(1); n++)
                            B[m, n] = a[m, n];
                    {
                        for (int x = 0; x < a.GetLength(1); x++)
                            B[i, x] = 0;
                        for (int y = 0; y < a.GetLength(0); y++)
                            B[y, j] = 0;
                        B[i, j] = 1;
                        SP[i, j] = MatrixSurplus(B);
                        AB[i, j] = X * SP[i, j];
                    }
                }     
            MatrixInver(AB, ref b);
              
            return true;     
          }     


转自:http://young.xh.blog.163.com/blog/static/956253200761310247675/
该博客值得学习
分享到:
评论

相关推荐

    matrix 矩阵运算类库C# 语言编写,适用于.NET

    本类库专注于矩阵运算,提供了丰富的功能,如矩阵的创建、加法、减法、乘法、求逆、求行列式、特征值、特征向量等。以下是对这个矩阵运算类库的详细介绍: 1. **矩阵创建**:类库支持动态创建不同大小的矩阵,可以...

    基于一维数组的c# 矩阵类源码

    在C#编程中,矩阵运算是一种常见的操作,特别是在科学计算、图像处理以及机器学习等领域。本文将深入探讨如何使用一维数组实现一个高效的C#矩阵类,并结合WPF4.0构建测试应用程序。 首先,一维数组是存储矩阵数据的...

    MathNet矩阵算法库,适用于C#

    1. **矩阵和向量操作**:支持创建、初始化、复制、转置、缩放、加减、乘法、逆、求行列式、特征值和特征向量等基本矩阵和向量运算。 2. **线性代数**:提供了高效率的线性系统求解器,如高斯消元法、LU分解、QR分解...

    基于httpblog.ivank.net的C#轻量级快速矩阵类_C#_下载.zip

    这包括但不限于矩阵的乘法、加法、减法、求逆、求行列式、特征值、特征向量等。在C#中,这些操作可能通过多线程或者SIMD(单指令多数据)指令集来加速,以提高并行计算性能。例如,库可能利用.NET框架的System....

    特奥里亚

    这些类提供了加法、减法、乘法和转置等基本操作,以及求逆、行列式和特征值等高级计算。 3. **数值解法**: C#中解决非线性方程的数值方法通常包括牛顿法、二分法和迭代法等。例如,`System.Numerics.RootFinding`...

Global site tag (gtag.js) - Google Analytics