博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在C 中实现矩阵运算
阅读量:3948 次
发布时间:2019-05-24

本文共 10688 字,大约阅读时间需要 35 分钟。

               

在C#中实现矩阵运算

本文博客链接:,作者:jdh,转载请注明.

环境:

主机:XP

开发环境:VS2008

功能:

在C#中实现矩阵运算

源代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;//矩阵数据结构  //二维矩阵  class _Matrix  {       public int m;      public int n;      public float[] arr;          //初始化      public _Matrix()    {        m = 0;          n = 0;     }    public _Matrix(int mm,int nn)    {        m = mm;          n = nn;     }    //设置m      public void set_mn(int mm,int nn)    {        m = mm;          n = nn;     }     //设置m      public void set_m(int mm)    {          m = mm;      }     //设置n      public void set_n(int nn)    {          n = nn;      }       //初始化      public void init_matrix()    {          arr = new float[m * n];      }      //释放      public void free_matrix()    {        //delete [] arr;    }      //读取i,j坐标的数据      //失败返回-31415,成功返回值      public float read(int i,int j)    {        if (i >= m || j >= n)        {            return -31415;        }        //return *(arr + i * n + j);        return arr[i * n + j];    }      //写入i,j坐标的数据      //失败返回-1,成功返回1      public int write(int i,int j,float val)    {        if (i >= m || j >= n)        {            return -1;        }        arr[i * n + j] = val;        return 1;    }  };//二维运算类  class _Matrix_Calc  {       //初始化    public  _Matrix_Calc()    {    }    //C = A + B      //成功返回1,失败返回-1      public  int add(ref _Matrix A,ref _Matrix B,ref _Matrix C)    {          int i = 0;          int j = 0;                    //判断是否可以运算          if (A.m != B.m || A.n != B.n ||              A.m != C.m || A.n != C.n)          {              return -1;          }          //运算          for (i = 0;i < C.m;i++)          {              for (j = 0;j < C.n;j++)              {                  C.write(i,j,A.read(i,j) + B.read(i,j));              }          }                    return 1;      }      //C = A - B      //成功返回1,失败返回-1      public  int subtract(ref _Matrix A,ref _Matrix B, ref _Matrix C)    {          int i = 0;          int j = 0;                    //判断是否可以运算          if (A.m != B.m || A.n != B.n ||             A.m != C.m || A.n != C.n)          {              return -1;          }          //运算          for (i = 0;i < C.m;i++)          {              for (j = 0;j < C.n;j++)              {                  C.write(i,j,A.read(i,j) - B.read(i,j));              }          }                    return 1;      }     //C = A * B      //成功返回1,失败返回-1      public int multiply(ref _Matrix A, ref _Matrix B, ref _Matrix C)    {          int i = 0;          int j = 0;          int k = 0;          float temp = 0;                    //判断是否可以运算          if (A.m != C.m || B.n != C.n ||              A.n != B.m)          {              return -1;          }          //运算          for (i = 0;i < C.m;i++)          {              for (j = 0;j < C.n;j++)              {                  temp = 0;                  for (k = 0;k < A.n;k++)                  {                      temp += A.read(i,k) * B.read(k,j);                  }                  C.write(i,j,temp);              }          }                    return 1;      }     //行列式的值,只能计算2 * 2,3 * 3      //失败返回-31415,成功返回值      public float det(ref _Matrix A)    {          float value = 0;                    //判断是否可以运算          if (A.m != A.n || (A.m != 2 && A.m != 3))          {              return -31415;          }          //运算          if (A.m == 2)          {              value = A.read(0,0) * A.read(1,1) - A.read(0,1) * A.read(1,0);          }          else          {              value = A.read(0,0) * A.read(1,1) * A.read(2,2) +                       A.read(0,1) * A.read(1,2) * A.read(2,0) +                      A.read(0,2) * A.read(1,0) * A.read(2,1) -                      A.read(0,0) * A.read(1,2) * A.read(2,1) -                      A.read(0,1) * A.read(1,0) * A.read(2,2) -                      A.read(0,2) * A.read(1,1) * A.read(2,0);          }                    return value;      }    //求转置矩阵,B = AT      //成功返回1,失败返回-1      public int transpos(ref _Matrix A,ref _Matrix B)    {          int i = 0;          int j = 0;                    //判断是否可以运算          if (A.m != B.n || A.n != B.m)          {              return -1;          }          //运算          for (i = 0;i < B.m;i++)          {              for (j = 0;j < B.n;j++)              {                  B.write(i,j,A.read(j,i));              }          }                    return 1;      }      //求逆矩阵,B = A^(-1)      //成功返回1,失败返回-1      public int inverse(ref _Matrix A, ref _Matrix B)    {          int i = 0;          int j = 0;          int k = 0;          _Matrix m = new _Matrix(A.m,2 * A.m);          float temp = 0;          float b = 0;                    //判断是否可以运算          if (A.m != A.n || B.m != B.n || A.m != B.m)          {              return -1;          }                    /*         //如果是2维或者3维求行列式判断是否可逆         if (A.m == 2 || A.m == 3)         {             if (det(A) == 0)             {                 return -1;             }         }         */                    //增广矩阵m = A | B初始化          m.init_matrix();          for (i = 0;i < m.m;i++)          {              for (j = 0;j < m.n;j++)              {                  if (j <= A.n - 1)                  {                      m.write(i,j,A.read(i,j));                  }                  else                  {                      if (i == j - A.n)                      {                          m.write(i,j,1);                      }                      else                      {                          m.write(i,j,0);                      }                  }              }          }                    //高斯消元          //变换下三角          for (k = 0;k < m.m - 1;k++)          {              //如果坐标为k,k的数为0,则行变换              if (m.read(k,k) == 0)              {                  for (i = k + 1;i < m.m;i++)                  {                      if (m.read(i,k) != 0)                      {                          break;                      }                  }                  if (i >= m.m)                  {                      return -1;                  }                  else                  {                      //交换行                      for (j = 0;j < m.n;j++)                      {                          temp = m.read(k,j);                          m.write(k,j,m.read(k + 1,j));                          m.write(k + 1,j,temp);                      }                  }              }                            //消元              for (i = k + 1;i < m.m;i++)              {                  //获得倍数                  b = m.read(i,k) / m.read(k,k);                  //行变换                  for (j = 0;j < m.n;j++)                  {                      temp = m.read(i,j) - b * m.read(k,j);                      m.write(i,j,temp);                  }              }          }          //变换上三角          for (k = m.m - 1;k > 0;k--)          {              //如果坐标为k,k的数为0,则行变换              if (m.read(k,k) == 0)              {                  for (i = k + 1;i < m.m;i++)                  {                      if (m.read(i,k) != 0)                      {                          break;                      }                  }                  if (i >= m.m)                  {                      return -1;                  }                  else                  {                      //交换行                      for (j = 0;j < m.n;j++)                      {                          temp = m.read(k,j);                          m.write(k,j,m.read(k + 1,j));                          m.write(k + 1,j,temp);                      }                  }              }                            //消元              for (i = k - 1;i >= 0;i--)              {                  //获得倍数                  b = m.read(i,k) / m.read(k,k);                  //行变换                  for (j = 0;j < m.n;j++)                  {                      temp = m.read(i,j) - b * m.read(k,j);                      m.write(i,j,temp);                  }              }          }          //将左边方阵化为单位矩阵          for (i = 0;i < m.m;i++)          {              if (m.read(i,i) != 1)              {                  //获得倍数                  b = 1 / m.read(i,i);                  //行变换                  for (j = 0;j < m.n;j++)                  {                      temp = m.read(i,j) * b;                      m.write(i,j,temp);                  }              }          }          //求得逆矩阵          for (i = 0;i < B.m;i++)          {              for (j = 0;j < B.m;j++)              {                  B.write(i,j,m.read(i,j + m.m));              }          }          //释放增广矩阵          m.free_matrix();                    return 1;      }  };  namespace test{    public partial class Form1 : Form    {        double zk;        double xkg, pkg, kk, xk, pk, q, r;        public Form1()        {            InitializeComponent();            xk = 0;            pk = 0;            q = 0.00001;            r = 0.0001;            int i = 0;            int j = 0;            int k = 0;              _Matrix_Calc m_c = new _Matrix_Calc();              //_Matrix m1 = new _Matrix(3,3);              //_Matrix m2 = new _Matrix(3,3);            //_Matrix m3 = new _Matrix(3,3);            _Matrix m1 = new _Matrix(2, 2);            _Matrix m2 = new _Matrix(2, 2);            _Matrix m3 = new _Matrix(2, 2);                           //初始化内存              m1.init_matrix();              m2.init_matrix();              m3.init_matrix();                            //初始化数据              k = 1;              for (i = 0;i < m1.m;i++)              {                  for (j = 0;j < m1.n;j++)                  {                      m1.write(i,j,k++);                  }              }                            for (i = 0;i < m2.m;i++)              {                  for (j = 0;j < m2.n;j++)                  {                      m2.write(i,j,k++);                  }              }            m_c.multiply(ref m1,ref  m2, ref m3);            //output.Text = Convert.ToString(m3.read(1,1));            output.Text = Convert.ToString(m_c.det(ref m1));        }        /*        private void button1_Click(object sender, EventArgs e)        {            zk = Convert.ToDouble(input.Text);            //时间方程            xkg = xk;            pkg = pk + q;             //状态方程            kk = pkg / (pkg + r);            xk = xkg + kk * (zk - xkg);            pk = (1 - kk) * pkg;            //输出            output.Text = Convert.ToString(xk);        }        private void textBox1_TextChanged(object sender, EventArgs e)        {        }         * */    }}

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!

你可能感兴趣的文章
什么话不可以和上司讲
查看>>
请学会淘汰你的上司
查看>>
以人为本
查看>>
全球分布式创新:企业致胜的关键
查看>>
上司最恨员工哪十大"罪行"
查看>>
和上司沟通必备8个黄金句
查看>>
竹笋和榕树的管理学
查看>>
让“抱怨”促进公司进步
查看>>
职场“站队”你站对了吗?
查看>>
培养员工能力与责任
查看>>
细分市场制胜
查看>>
空降兵变革是怎样失败的
查看>>
伟大决策的6大基石
查看>>
MTK编译笔记
查看>>
深入理解各种指针
查看>>
Android的SeekBar
查看>>
SMS 和 MMS 在输入字母的响应不一致
查看>>
如何判断手机是否处于漫游状态?
查看>>
恢复出厂设置时删除手机上所有联系人
查看>>
根据Sim卡的插卡情况过滤通话记录
查看>>