首页 > 编程 > C# > 正文

C#中矩阵运算方法实例分析

2020-01-24 01:58:10
字体:
来源:转载
供稿:网友

本文实例讲述了C#中矩阵运算方法。分享给大家供大家参考。具体分析如下:

一、测试环境:

主机: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)  {  }   * */ }}

希望本文所述对大家的C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表