十年阿桑
-
TAG:程序设计思想及范例,矩阵运算 TEXT: 矩阵运算是数学中的一种基本运算,可以用编程的方法处理。一般来说,多维矩阵处理的问题总可以转换成多维数组的问题,直接用矩阵运算的公式进行处理即可。例10-17 编写程序,可以实现m*n矩阵和n*p矩阵相乘。m,n,p均小于10,矩阵元素为整数。首先我们可以根据题意写出函数头。可以定为void MatrixMutiply(int m,int n,int p,long lMatrix1[MAX][MAX],long lMatrix2[MAX][MAX],long lMatrixResult[MAX][MAX]),其中lMatrix1和lMatrix2分别是输入的m*n矩阵和n*p矩阵,lMatrixResult是输出的m*p矩阵。因为m,n和p都是未知量,要进行处理的矩阵大小是变量。但我们可以定义比较大的二维数组,只使用其中的部分数组元素。矩阵相乘的算法比较简单,输入一个m*n矩阵和一个n*p矩阵,结果必然是m*p矩阵,有m*p个元素,每个元素都需要计算,可以使用m*p嵌套循环进行计算。根据矩阵乘法公式: 可以用循环直接套用上面的公式计算每个元素。嵌套循环内部进行累加前,一定要注意对累加变量进行清零。 #define MAX 10 void MatrixMutiply(int m,int n,int p,long lMatrix1[MAX][MAX], long lMatrix2[MAX][MAX],long lMatrixResult[MAX][MAX]) { int i,j,k; long lSum; /*嵌套循环计算结果矩阵(m*p)的每个元素*/ for(i=0;i<m;i++) for(j=0;j<p;j++) { /*按照矩阵乘法的规则计算结果矩阵的i*j元素*/ lSum=0; for(k=0;k<n;k++) lSum+=lMatrix1[i][k]*lMatrix2[k][j]; lMatrixResult[i][j]=lSum; } } main() { long lMatrix1[MAX][MAX],lMatrix2[MAX][MAX]; long lMatrixResult[MAX][MAX],lTemp; int i,j,m,n,p; /*输入两个矩阵的的行列数m,n,p*/ printf(" Please input m of Matrix1: "); scanf("%d",&m); printf("Please input n of Matrix1: "); scanf("%d",&n); printf("Please input p of Matrix2: "); scanf("%d",&p); /*输入第一个矩阵的每个元素*/ printf(" Please elements of Matrix1(%d*%d): ",m,n); for(i=0;i<m;i++) for(j=0;j<n;j++) { scanf("%ld",&lTemp); lMatrix1[i][j]=lTemp; } /*输入第二个矩阵的每个元素*/ printf(" Please elements of Matrix2(%d*%d): ",n,p); for(i=0;i<n;i++) for(j=0;j<p;j++) { scanf("%ld",&lTemp); lMatrix2[i][j]=lTemp; } /*调用函数进行乘法运算,结果放在lMatrixResult 中*/ MatrixMutiply(m,n,p,lMatrix1,lMatrix2,lMatrixResult); /*打印输出结果矩阵*/ printf(" Result matrix: "); for(i=0;i<m;i++) { for(j=0;j<p;j++) printf("%ld ",lMatrixResult[i][j]); printf(" "); } } 程序运行的结果为: Please input m of Matrix1: 3 Please input n of Matrix1: 2 Please input p of Matrix2: 3 Please elements of Matrix1(3*2): 1 2 0 1 3 0 Please elements of Matrix2(2*3): 1 2 0 3 1 1 Result matrix: 7 4 2 3 1 1 3 6 0 例10-18 编写程序,实现n*n整数方阵的转置(n小于10)。使用嵌套循环,将二维数组的元素a[i][j]和a[j][i]交换即可。注意矩阵对角线右上角的所有元素和矩阵对角线左下角的元素交换,对角线元素不用交换。因此,只需要n(n-1)/2次对调。如果使用nn的嵌套循环进行交换,则每个元素被交换了两次,结果相当于矩阵没有转置。 #define MAX 10 main() { long lMatrix[MAX][MAX],lTemp; int i,j,n; /*输入矩阵的n*/ printf("Please input n of Matrix: "); scanf("%d",&n); /*输入矩阵的每个元素*/ printf(" Please input elements of Matrix(%d*%d): ",n,n); for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%ld",&lTemp); lMatrix[i][j]=lTemp; } /*对调a[i][j]和a[j][i] */ for(i=0;i<n;i++) for(j=0;j<i;j++) { lTemp=lMatrix[i][j]; lMatrix[i][j]= lMatrix[j][i]; lMatrix[j][i]=lTemp; } /*打印输出结果*/ printf(" Result matrix: "); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%ld ",lMatrix[i][j]); printf(" "); } } 程序运行的结果为: Please input n of Matrix: 4 Please input elements of Matrix(4*4): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Result matrix: 1 5 9 13 2 6 10 14 3 7 11 15 8 12 16 REF:.txt
满意请采纳