zoukankan      html  css  js  c++  java
  • 封装了 C# 矩阵计算类CMarix

    项目中用到矩阵计算,在网上没有搜到合适的矩阵运算类,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 下载

        
    作者:wanglei_wan
        
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Balder 3D开发系列之创建基本动画
    Expression Blend 的点滴(1)ListBox华丽大变身
    Balder 3D开发系列之创建天空盒
    Balder 3D开发系列之创建自己的primitives
    silverlight 中的应用程序库缓存
    Balder 3D开发系列之——sprite结合Camera旋转木马特效
    VisualTreeHelper不仅仅只是用来查看可视化树结构的
    Balder 3D开发系列之与Sprite初次相遇
    Balder 3D开发系列之给自定义基本体进行贴图操作
    【图解】通过Expression Blend快速制作具有物理效果的动画游戏
  • 原文地址:https://www.cnblogs.com/because/p/2826965.html
Copyright © 2011-2022 走看看