/// /问题:C#实现两个N*N矩阵的乘法,矩阵必须由一维数组表示 /// 未使用递归版本,相关异常未写入,只完成实现。 /* * 说明: * 用一维数组表示n*n矩阵,数组长度为n*n * 1行1列数据对应的数组索引号为0 * 1行2列数据对应的数组索引号为1 * 1行3列数据对应的数组索引号为2 * i行j列数据对应的数组索引号为(i-1)*n+(j-1) * 数组索引号k对应的矩阵行数为(k+1)/n+1取整,列数为(k+1)/n取余数 * * 理论: * 矩阵a,i行j列,矩阵b,j行m列,a*b得到一个i行m列矩阵c * 用c(i,m)表示矩阵c的i行m列 * c(i,m)值=a(i,1)*b(1,m)+……+a(i,j)*b(j,m) */ /// <summary> /// n和arrA、arrB的初构必须一致 /// </summary> const int n = 2; double[] arrA ; double[] arrB; /// <summary> /// 计算矩阵相乘 /// </summary> void run() { arrA = new double[n * n] { 1, 2, 3, 4 }; arrB = new double[n * n] { 5, 6, 7, 8 }; printArray(arrA); printArray(arrB); double[] arrResult = new double[n * n]; for (int iR = 1; iR <= n; iR++) { for (int iC = 1; iC <= n; iC++) { double value=0; for (int i = 1; i <= n; i++) { value += getValue(iR, i, arrA) * getValue(i, iC, arrB); } setValue(iR,iC,value,arrResult); } } Console.WriteLine("前者乘后者后:"); printArray(arrResult); } /// <summary> /// 获取矩阵指定行列的值 /// </summary> /// <param name="row">指定行</param> /// <param name="col">指定行</param> /// <param name="arr">由一维数组表示的数组</param> /// <returns></returns> double getValue(int row, int col,double[] arr) { int index = (row - 1) * n + col - 1; return arr[index]; } /// <summary> /// 修改矩阵指定行列的值 /// </summary> /// <param name="row">指定行</param> /// <param name="col">指定行</param> /// <param name="value">修改值</param> /// <param name="arr">由一维数组表示的数组</param> void setValue(int row,int col,double value,double[] arr) { int index = (row - 1) * n + col - 1; arr[index] = value; } /// <summary> /// 打印矩阵,方便查看显示 /// </summary> /// <param name="arr"></param> void printArray(double[] arr) { int num=Convert.ToInt32( Math.Sqrt(arr.Length)); Console.WriteLine("矩阵"); for (int i = 1; i <= num; i++) { Console.Write("行"+i+":"); for (int j = 1; j <= num; j++) { Console.Write(getValue(i, j, arr) + " "); } Console.Write((char)10); } }