在数学中,矩阵(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();
}
}
这时出现了问题,我创建的三个矩阵完全相同。
对于矩阵中的元素赋值我采用随机数的方法,回到矩阵赋值类查看原因
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#的随机数生成是默认依靠时间。
那么就存在一种可能,是拆箱运行太快,并且对时间精度处理不细致。对于使用的时间精度没有考证。
因此我引入
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();
}
}
结果
成功了。
但是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();
}
}
结果
很尴尬的发现和静态方法无关,看来我是误会什么了。还要学习啊。
静态方法属于类所有,为各个类的实例所公用。
然而我这里写的静态方法就是一个方法,被直接调用,因此每次的结果是不同的。
再保留一下当前代码
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
对于随机数生成如果一直使用休眠的方法会影响程序的运行效率,应该采用其他方法,明天再探讨。还有运算符重载明天再说吧。