C#中矩阵运算方法实例分析
更新时间:2020年6月25日 11:30 点击:2151
本文实例讲述了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#程序设计有所帮助。
上一篇: C#导出数据到CSV文件的通用类实例
下一篇: C#获取指定PDF文件页数的方法
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25