在C 中实现矩阵运算

               

在C#中实现矩阵运算


本文博客链接:http://blog.csdn.net/jdh99,作者: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)        {        }         * */    }}


           

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值