项目中用到矩阵计算,在网上没有搜到合适的矩阵运算类,C#类库中的matrix类又不是很合心意,于是乎自己写了一个,完成后总结了一下,发布了上来。完成的DLL文件及使用例程在文章最后有下载链接
使用方法和步骤:
一,引用方法
1:在你想用的工程中添加引用,引用你所下载的文件
MatrixDevelopTest\MatrixDevelopTest\bin\Debug\Matrix.dll
2:在你工程中需要做矩阵计算的类中的最上边加上using CMatrix;就可以在其中使用了。
二,Matrix类使用方法
1,创建Matrix类的对象,此对象就表示一个矩阵对象,我重载了四种矩阵对象的初始化方法
public Matrix(int size);即初始化方阵,size为方阵的大小 public Matrix(int rows, int cols);用行数和列数初始化矩阵,rows为行数,cols为列数 public Matrix(double[,] data);用双精度二维数组初始化矩阵 public Matrix(double[] data, Direction direction);用双精度一维数组初始化向量型矩阵,这里 //第二个参数为枚举,需设置为Matrix.Direction.vertical或 //Matrix.Direction.horizontal意为相应的创建列向量或行向量
2,对+,-,*,==,!==进行了运算符的重载,其中+,-,==,!=的操作数只能是Matrix类型,*支持double
和Matrix的相乘,即系数乘矩阵
3,数据类型转换
Matrix类对象只可以装换成double[,]即双精度二维数组的形势
eg: Matrix matrixObj=new Matrix(5);
double[,] temp=matrixObj.Data;
4,数据索引
Matrix对象有一个public double[,] Data;的对象级别的数据成员,为该矩阵对象的矩阵数据,你可
以采用诸如matrixObj.Data[0,0]的形势索引其矩阵的元素值,也可以采用matrixObj[0,0]的方式索引
其矩阵的元素值
5,一些对象级别属性
rows cols IsSquare IsSingular分别是行数,列数,是否是方阵,是否行列式值为零
6,一些类级别的静态方法
public static double[,] Inverse(double[,] a)//矩阵求逆 public static double[,] Transpose(double[,] a)//矩阵转置 public static Matrix Zeros(int size)//产生零矩阵 public static Matrix Zeros(int rows, int cols) public static double[,] eyes(int n)//产生单位阵 public static Matrix Combine(Matrix m, Matrix n, Direction Dir)//合并矩阵,后面的例程里面有 //演示
三,例程1
此例程在你下载的文档里面有:
下面是主程序
Matrix R1 = Matrix.Combine(new Matrix(Matrix.eyes(3)), Matrix.Zeros(3), Matrix.Direction.horizontal);//新建两个矩阵(3型单位阵,3型零矩阵)进行横向拼接 R1 = 10000 * R1;//系数乘以矩阵 Matrix R2 = Matrix.Combine(Matrix.Zeros(3), new Matrix(Matrix.eyes(3)), Matrix.Direction.horizontal); Matrix R = Matrix.Combine(R1, R2, Matrix.Direction.horizontal); R.Display();//显示,只针对控制台模式 Console.ReadLine();
例程2
针对一些邮件的问题我又重新编写了一个例程,主要包括矩阵初始化和类型转
化等,内容要详实些。
Matrix R1 = Matrix.Combine(new Matrix(Matrix.eyes(3)), Matrix.Zeros(3), Matrix.Direction.horizontal); R1 = 10000 * R1; Matrix R2 = Matrix.Combine(Matrix.Zeros(3), new Matrix(Matrix.eyes(3)), Matrix.Direction.horizontal); Matrix R = Matrix.Combine(R1, R2, Matrix.Direction.horizontal); double[,] temp = R.Data;//将Matrix对象的值赋给double[,] Matrix K = new Matrix(temp);//用double[,]初始化Matrix对象 double[] temp2 =new double[4]{1,2,3,4}; Matrix H1 = new Matrix(temp2, Matrix.Direction.horizontal);//用double[]初始化Matrix对象 Matrix H2= new Matrix(temp2, Matrix.Direction.vertical); Console.WriteLine("下面输出H1"); H1.Display(); Console.WriteLine("H1输出完"); Console.WriteLine(); Console.WriteLine("下面输出H2"); H2.Display(); Console.WriteLine("H2输出完"); Console.WriteLine(); Console.WriteLine("下面输出K"); K.Display(); Console.WriteLine("K输出完"); Console.WriteLine(); Console.WriteLine("下面输出R"); R.Display(); Console.WriteLine("R输出完"); Console.WriteLine(); Console.WriteLine("下面输出temp"); foreach (double d in temp) Console.WriteLine(d); Console.WriteLine("temp输出完"); Console.ReadLine();
四,声明
1,我不是个专业的程序员,此类为本人自己在编程序需要时封装的,不保证进行完全的异常测试,不保证结果的正确性,你可以随意下载使用和复制,使用时请自行测试。本人不承担任何法律责任,只作为学习和研究,不可用于商业用途。
2,我会在使用中逐渐完善此类并及时发布在这里,如果有什么使用上的问提或是Bug请反馈,我会尽量及时回复并改正后发布到这里。
五,下载
DLL:
版本1.0.0.0 发布时间20090410 初版 DLL 下载