C#中矩阵运算方法实例分析
来源: 阅读:948 次 日期:2015-04-24 10:30:30
温馨提示: 小编为您整理了“C#中矩阵运算方法实例分析”,方便广大网友查阅!

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

这篇文章主要介绍了C#中矩阵运算方法,实例分析了通过C#实现矩阵的初始化、转置矩阵、求逆矩阵等各种常用的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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#程序设计有所帮助。

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map