用C#实现矩阵

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数的集合

对于一个长方形可以使用一个二维数组来实现。
于是

    public class Matrix//矩阵类
    {
        public int[,] x;//定义一个矩阵字段
    }

矩阵是需要大小的,如 m*n 的矩阵,就是 m 行 n 列。

Matrix x = new Matrix();//对矩阵类实例化

这时我们完成了一个矩阵类,并对其实例化。
但是现在缺少内容,大小也没有确认。

    public class CreatMatrix//为矩阵随机赋值
    {
        public static int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

实现一个创建矩阵类,创建一个静态方法,传入矩阵的长和宽随机为矩阵赋值。
随机方法通过对 Random() 实例化完成。

在完成矩阵定义,创建,之后需要获取矩阵。
对于直接输出矩阵会得到 System.Int32[,]

WriteLine(矩阵);

要注意,数组是引用类型,因此会返回它的引用,而不是内容。
对于int数组的内容是值类型的,要获取全部元素需要对其遍历

    public class ShowMatrix//暂时二维数组
    {
        public static void showM(int[,] x)//传入数组
        {
            //int k = x.Rank;//获取数组维度
            int m = x.GetLength(0);//获取行数
            int n = x.GetLength(1);//获取行列
            //GetLength() 获取指定维度长度,而对于多维数组的维度如[5,7,9]
            //5是一维的长度,7是二维的长度,9是三维的长度
            for (int i = 0; i < m; i++)//每一行
            {                           
                for (int j = 0; j < n; j++)//每一列
                {                  
                    Write("{0} ",x[i,j]);                   // 输出数组中的元素
                }
                WriteLine();                                //换行
            }
        }
    }

这里就实现了传入一个 二维数组,获取其行和列的长度
GetLength(0)是行的长度。
GetLength(1)是列的长度.
其中0和1表示的是其维度。

完整代码如下

using System;
using static System.Console;

namespace ConsoleApp
{
    public class Matrix//矩阵类
    {
        public int[,] x;//定义一个矩阵字段
    }
    public class CreatMatrix//为矩阵随机赋值
    {
        public static int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

对于矩阵应该实现加法,乘法运算。
这就涉及到运算符重载。

要进行矩阵运算就不能只有一个矩阵,因此我创建多个矩阵

    class Program
    {
        static void Main(string[] args)
        {
            Matrix x1 = new Matrix();
            Matrix x2 = new Matrix();
            Matrix x3 = new Matrix();
            x1.x = CreatMatrix.creaM(7, 10);
            x2.x = CreatMatrix.creaM(7, 10);
            x3.x = CreatMatrix.creaM(7, 10);
            ShowMatrix.showM(x1.x);
            WriteLine("----------------");
            ShowMatrix.showM(x2.x);
            WriteLine("----------------");
            ShowMatrix.showM(x3.x);
            WriteLine("----------------");
            ReadKey();
        }
    }

这时出现了问题,我创建的三个矩阵完全相同。


image.png

对于矩阵中的元素赋值我采用随机数的方法,回到矩阵赋值类查看原因

    public class CreatMatrix//为矩阵随机赋值
    {
        public static int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

发现我写的赋值矩阵方法是静态的,静态方法对每个实例都是相同的(应该是这样说的吧)。
但是我将其改写为实例方法后发现还是不行,我由为其创建多个实例对象结果还是一样。(别试了,跟这些没关系)
于是开始寻找别的原因,众所周知,计算机的随机数都是伪随机,通过一些特点的算法使用不同的参数得到不同的值,参数作为种子如果被获悉就可以推断出后续的结果。因此计算机的随机数都是伪随机。
看一下编译器解析


image.png

发现C#的随机数生成是默认依靠时间。
那么就存在一种可能,是拆箱运行太快,并且对时间精度处理不细致。对于使用的时间精度没有考证。
因此我引入

using System.Threading;

然后休眠500毫秒,也就是5秒

Thread.Sleep(500);

此时的赋值类

    public class CreatMatrix//为矩阵随机赋值
    {
        public int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

此时的运行程序

    class Program
    {
        static void Main(string[] args)
        {
            Matrix x1 = new Matrix();
            Matrix x2 = new Matrix();
            Matrix x3 = new Matrix();
            CreatMatrix c = new CreatMatrix();
            x1.x = c.creaM(7, 10);
            Thread.Sleep(500);
            x2.x = c.creaM(7, 10);
            Thread.Sleep(500);
            x3.x = c.creaM(7, 10);
            ShowMatrix.showM(x1.x);
            WriteLine("----------------");
            ShowMatrix.showM(x2.x);
            WriteLine("----------------");
            ShowMatrix.showM(x3.x);
            WriteLine("----------------");
            ReadKey();
        }
    }

结果


image.png

成功了。
但是500毫秒的休眠时间对程序运行速度产生影响,因此尝试缩小范围,在我的计算机行10毫秒左右总会出现3个矩阵两个相等,但也会出现完全不相等的情况,5毫秒左右几乎完全相等,但也存在有一个不同于其他两个,在20毫秒左右几乎不会出现相等。

然后在测试一下是否和静态方法有关。
赋值类

    public class CreatMatrix//为矩阵随机赋值
    {
        public static int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

运行

    class Program
    {
        static void Main(string[] args)
        {
            Matrix x1 = new Matrix();
            Matrix x2 = new Matrix();
            Matrix x3 = new Matrix();
            x1.x = CreatMatrix.creaM(7, 10);
            Thread.Sleep(500);
            x2.x = CreatMatrix.creaM(7, 10);
            Thread.Sleep(500);
            x3.x = CreatMatrix.creaM(7, 10);
            ShowMatrix.showM(x1.x);
            WriteLine("----------------");
            ShowMatrix.showM(x2.x);
            WriteLine("----------------");
            ShowMatrix.showM(x3.x);
            WriteLine("----------------");
            ReadKey();
        }
    }

结果


image.png

很尴尬的发现和静态方法无关,看来我是误会什么了。还要学习啊。

静态方法属于类所有,为各个类的实例所公用。
然而我这里写的静态方法就是一个方法,被直接调用,因此每次的结果是不同的。

再保留一下当前代码

using System;
using static System.Console;
using System.Threading;

namespace ConsoleApp
{
    public class Matrix//矩阵类
    {
        public int[,] x;//定义一个矩阵字段
    }
    public class CreatMatrix//为矩阵随机赋值
    {
        public static int[,] creaM (int m,int n)
        {
            int[,] x = new int[m, n];//初始化矩阵
            Random r = new Random();//创建随机类实例
            for (int i = 0;i < m; i++)//对二维矩阵所有点遍历
            {
                for (int j = 0; j 

对于随机数生成如果一直使用休眠的方法会影响程序的运行效率,应该采用其他方法,明天再探讨。还有运算符重载明天再说吧。

你可能感兴趣的:(用C#实现矩阵)