在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)
{
}
* */
}
}
分享到:
相关推荐
该文件中包含了各种数组运算,都是用C#语言编写,有矩阵的转置;求逆矩阵;两个矩阵相乘,相加,相减;构造单位对角矩阵;矩阵否相等;托伯利兹矩阵求逆的埃兰特方法;求行列式值的全选主元高斯消去法;求矩阵秩的...
用C#实现的矩阵类,包含各种类型矩阵的定义,能够实现矩阵的各种运算。
Winform实现矩阵运算,根据输入的行列数随机生成矩阵,实现加减乘运算,也可更换皮肤
在C#中实现矩阵运算 三、源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using ...
代码可以实现以下功能: 1.矩阵加法 2.矩阵减法 3.矩阵乘法 4.矩阵行列式 5.矩阵转置 6.矩阵的伴随矩阵 7.矩阵的逆(只限于3x3) 8.向量的单位化 此代码为本人做3D建模(空间旋转)时用的基础代码
用C#实现的矩阵计算类库,实现矩阵的各种运算,类似MATLAB矩阵运算。包括类库和实例DEMO
用C#实现对矩阵的基本运算,C#窗体实现
C#实现矩阵运算(包括矩阵的加减乘除转置求逆等)
c#实现实数和复数的常用矩阵运算(矩阵乘、数乘、求逆、卷积、产生服从正态分布的随机数)
c#矩阵运算 简单实现C#矩阵运算 对坐标转换有很大的作用
C#代码实现的矩阵常用运算,如矩阵的加、减、乘、除、求逆等,以类库的形式给出,方便调用。
C#实现的矩阵类 功能:可以进行矩阵转置,矩阵相乘,矩阵相加,矩阵求逆。 输入输出: 用户可以输入矩阵值后,可以选择矩阵运算类型,每次运算后都要输出运算后的矩阵。 若有错误,提示错误。
包含MATLAB基本的矩阵运算的C#代码实现,方便实际开发用,如求逆矩阵,矩阵相乘,矩阵乘向量,返回矩阵的某一行,某一列,以及求向量,矩阵范数-2的方法,多提意见,进行改进。
一个整合了矩阵运算的C类,这个是我在网上找到的,拿出来与大家分享。
用C#实现的矩阵运算,对用伴随矩阵的求逆方法更改为LU分解法求逆矩阵。
本程序是在控制台下实现2行3列矩阵与3行4列矩阵的乘法,两矩阵都可自己输入或者直接在代码里定义。
稀疏矩阵运算器(严版) C#实现,可运行。visual stutio team work 编译
C# 矩阵算法 .net 矩阵算法。C#矩阵运算类。实现转置,相乘,相加,求逆。
功能:可以进行矩阵转置,矩阵相乘,矩阵相加,矩阵求逆。 输入输出: 用户可以输入矩阵值后,可以选择矩阵运算类型,每次运算后都要输出运算后的矩阵。 若有错误,提示错误。