C#矩阵类

来源:互联网 发布:比尔盖茨的编程能力 编辑:程序博客网 时间:2024/04/30 16:48

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace PSP3
{
    public struct NNMatrix
    {


        public int row, col;
        public double[,] Matrix;

        public NNMatrix(int Mrow, int Mcol)  //指定行列数创建矩阵,初始值为0矩阵
        {
            row = Mrow;
            col = Mcol;
            Matrix = new double[row, col];
            for (int i = 0; i < row; i++)
                for (int j = 0; j < col; j++)
                    Matrix[i, j] = 0;
        }

 

        public static NNMatrix operator +(NNMatrix m1, NNMatrix m2)   //矩阵加法
        {
            if (m1.row == m2.row && m1.col == m2.col)
                for (int i = 0; i < m1.row; i++)
                    for (int j = 0; j < m2.col; j++)
                        m1.Matrix[i, j] += m2.Matrix[i, j];
            return (m1);
        }

 

        public static NNMatrix operator +(NNMatrix m1, double m2)    //矩阵加常量
        {
            for (int i = 0; i < m1.row; i++)
                for (int j = 0; j < m1.col; j++)
                    m1.Matrix[i, j] += m2;
            return (m1);
        }

 

        public static NNMatrix operator -(NNMatrix m1, NNMatrix m2)  //矩阵减法
        {
            if (m1.row == m2.row && m1.col == m2.col)
                for (int i = 0; i < m1.row; i++)
                    for (int j = 0; j < m2.col; j++)
                        m1.Matrix[i, j] -= m2.Matrix[i, j];
            return (m1);
        }

 

        public static NNMatrix operator *(NNMatrix m1, NNMatrix m2) //矩阵乘法
        {
            int m3r = m1.row;
            int m3c = m2.col;
            NNMatrix m3 = new NNMatrix(m3r, m3c);

            if (m1.col == m2.row)
            {
                double value = 0.0;            
                for (int i = 0; i < m3r; i++)
                    for (int j = 0; j < m3c; j++)
                    {
                        for (int ii = 0; ii < m1.col; ii++)
                            value += m1.Matrix[i, ii] * m2.Matrix[ii, j];

                        m3.Matrix[i,j] = value;
                    }
            }
            else
                throw new Exception("矩阵的行/列数不匹配。");

            return m3;
        }

 

        public static NNMatrix operator *(NNMatrix m1, double m2) //矩阵乘以常量
        {
            for (int i = 0; i < m1.row; i++)
                for (int j = 0; j < m1.col; j++)
                    m1.Matrix[i, j] *= m2;
            return (m1);
        }

        public static NNMatrix Transpos(NNMatrix srcm)  //矩阵转秩
        {
         
            NNMatrix tmpm=new NNMatrix(srcm.col,srcm.row);
            for (int i = 0; i < srcm.row; i++)
                for (int j = 0; j < srcm.col; j++)
                {  
                    if (i != j)
                    {
                        tmpm.Matrix[j, i] = srcm.Matrix[i, j];
                    }
                    else
                        tmpm.Matrix[i, j] =srcm.Matrix[i,j];
                }
            return tmpm;
        }

        private static void swaper(double m1, double m2) //交换
        {
            double sw;
            sw = m1; m1 = m2; m2 = sw;
        }

 

  /**
   * 实矩阵求逆的全选主元高斯-约当法
   *
   */
        public static NNMatrix Invers(NNMatrix srcm)           //矩阵求逆
        {
            int rhc = srcm.row;
            if (srcm.row == srcm.col)
            {
                int[] iss = new int[rhc];
                int[] jss = new int[rhc];
                double fdet = 1;
                double f = 1;
                //消元
                for (int k = 0; k < rhc; k++)
                {
                    double fmax = 0;
                    for (int i = k; i < rhc; i++)
                    {
                        for (int j = k; j < rhc; j++)
                        {
                            f =Math.Abs(srcm.Matrix[i, j]);
                            if (f > fmax)
                            {
                                fmax = f;
                                iss[k] = i;
                                jss[k] = j;
                            }
                        }
                    }

                    if (iss[k] != k)
                    {
                        f = -f;
                        for (int ii = 0; ii < rhc; ii++)
                        {
                            swaper(srcm.Matrix[k, ii], srcm.Matrix[iss[k], ii]);
                        }
                    }

                    if (jss[k] != k)
                    {
                        f = -f;
                        for (int ii = 0; ii < rhc; ii++)
                        {
                            swaper(srcm.Matrix[k, ii], srcm.Matrix[jss[k], ii]);
                        }
                    }

                    fdet *= srcm.Matrix[k, k];
                    srcm.Matrix[k, k] = 1.0 / srcm.Matrix[k, k];
                    for (int j = 0; j < rhc; j++)
                        if (j != k)
                            srcm.Matrix[k, j] *= srcm.Matrix[k, k];

                    for (int i = 0; i < rhc; i++)
                        if (i != k)
                            for (int j = 0; j < rhc; j++)
                                if (j != k)
                                    srcm.Matrix[i, j] = srcm.Matrix[i, j] - srcm.Matrix[i, k] * srcm.Matrix[k, j];
                   
                    for (int i = 0; i < rhc; i++)
                        if (i != k)
                            srcm.Matrix[i, k] *= -srcm.Matrix[k, k];
                }
                // 调整恢复行列次序
                for (int k = rhc - 1; k >= 0; k--)
                {
                    if (jss[k] != k)
                        for (int ii = 0; ii < rhc; ii++)
                            swaper(srcm.Matrix[k, ii], srcm.Matrix[jss[k], ii]);
                    if (iss[k] != k)
                        for (int ii = 0; ii < rhc; ii++)
                            swaper(srcm.Matrix[k, ii], srcm.Matrix[iss[k], ii]);
                }
            }

            return srcm;

        }


        public string MatrixPrint()   //矩阵输出
        {
            string tmprst;
            tmprst = "/n";
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < col; j++)
                {
                    tmprst += Matrix[i, j].ToString() + "/t";
                }
                tmprst += "/n";
            }
            return tmprst;
        }
      

    }

}

原创粉丝点击