1. 矩阵加和矩阵减
设A、B、C为矩阵,则矩阵加为C=A+B,矩阵减为C=A-B。矩阵加减运算的条件是两矩阵的行数和列数相等。
例1:矩阵加运算。
#include<stdio.h>
#define M 3
#define N 2
main(){
int i,j;
int a[M][N],b[M][N],c[M][N];
printf("请输入矩阵a的元素:/n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
printf("请输入矩阵b的元素:/n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&b[i][j]);
printf("您所输入的矩阵a的元素为:/n");
for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%-5d",a[i][j]);
printf("/n");
}
printf("您所输入的矩阵a的元素为:/n");
for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%-5d",b[i][j]);
printf("/n");
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=a[i][j]+b[i][j];
printf("矩阵相加的结果为:/n");
for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%-5d",c[i][j]);
printf("/n");
}
}
2. 矩阵乘C=A*B
设有矩阵A[M][L]、B[L][N],则A与B相乘所得结果矩阵C[M][N]。矩阵乘运算的条件是A矩阵的列数必须等于B矩阵的行数。运算规则:C矩阵的元素是A矩阵的一行元素与B矩阵的一列元素一一对应相乘后再相加的结果值。
例3:矩阵乘C=A*B
#include<stdio.h>
#define M 3
#define L 2
#define N 4
main(){
int i,j,k;
int a[M][L],b[L][N],c[M][N];
printf("请输入矩阵a的元素:/n");
for(i=0;i<M;i++)
for(j=0;j<L;j++)
scanf("%d",&a[i][j]);
printf("请输入矩阵b的元素:/n");
for(i=0;i<L;i++)
for(j=0;j<N;j++)
scanf("%d",&b[i][j]);
printf("您所输入的矩阵a的元素为:/n");
for(i=0;i<M;i++){
for(j=0;j<L;j++)
printf("%-5d",a[i][j]);
printf("/n");
}
printf("您所输入的矩阵a的元素为:/n");
for(i=0;i<L;i++){
for(j=0;j<N;j++)
printf("%-5d",b[i][j]);
printf("/n");
}
for(i=0;i<M;i++)//矩阵乘运算
for(j=0;j<N;j++){
c[i][j]=0;
for(k=0;k<L;k++)
c[i][j]+=a[i][k]*b[k][j];
}
printf("矩阵相乘的结果为:/n");
for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%-5d",c[i][j]);
printf("/n");
}
}
3. 转置矩阵A T 矩阵转置运算的条件是A矩阵必须是方阵(行数等于列数)。运算规则是以主对角线为基准,A[i][j]与A[j][i]对换。 例3:求矩阵的置换运算
#include<stdio.h>
#define M 3
main(){
int i,j,temp;
int a[M][M];
printf("请输入矩阵的元素:/n");
for(i=0;i<M;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
printf("您所输入的矩阵的元素为:/n");
for(i=0;i<M;i++){
for(j=0;j<M;j++)
printf("%-5d",a[i][j]);
printf("/n");
}
for(i=0;i<M;i++)//矩阵置换运算
for(j=i+1;j<M;j++){
if(i!=j)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
printf("矩阵置换的结果为:/n");
for(i=0;i<M;i++){
for(j=0;j<M;j++)
printf("%-5d",a[i][j]);
printf("/n");
}
}
4. 排序 二维数组的排序和一位数组的排序基本相同,所不同的是:二维数组的排序只能按某列来排,而在某列的两个数据需进行交换时,不能像一维数组那样只是两个数据的交换,而需要交换着两个数据所在的行对应的全部数据,一般处理方法是使用循环来实现。 例4:对于一个二维数组,按照用户需求按某列数据进行排序,并输出排序后的数据结果。 #include<stdio.h> #define M 3 #define N 4 main(){ int a[M][N]={9,7,8,5,3,11,4,6,4,1,10,2},i,j,k,temp,n; printf("运行结果为:/n"); printf("数组a[%d][%d](排序前):/n",M,N); for(i=0;i<M;i++){ for(j=0;j<N;j++) printf("= ",a[i][j]); printf("/n"); } printf("请输入排序的列号:/n"); scanf("%d",&n); for(i=0;i<M-1;i++)//控制每次的比较和交换 for(j=i+1;j<M;j++)//比较 { if(a[i][n-1]<a[j][n-1]) for(k=0;k<N;k++) { temp=a[i][k]; a[i][k]=a[j][k]; a[j][k]=temp; } } printf("/n数组a[%d][%d](排序后):/n",M,N); for(i=0;i<M;i++){ for(j=0;j<N;j++) printf("= ",a[i][j]); printf("/n"); } } 例5:在一个二维数组中求最大值所在的行、列值。 #include<stdio.h> #define M 3 #define N 4 main(){ int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12}; int i,j,max; int row,col; printf("运行结果为:/n"); for(i=0;i<M;i++){ for(j=0;j<N;j++) printf("]",a[i][j]); printf("/n"); } max=a[0][0]; for(i=0;i<M;i++) for(j=0;j<N;j++) if(max<a[i][j]){ max=a[i][j]; row=i; col=j; } printf("矩阵中的最大值为:%d,其位于%d行,%d列/n",max,row,col); } 例6:在二维数组中a中选出各行最大的元素组成一个一维数组b。 #include<stdio.h> #define M 3 #define N 4 main(){ int b[M]; int a[M][N]={3,16,87,65,4,32,11,108,10,25,12,27}; int i,j; printf("运行结果为:/n"); printf("矩阵a为:/n"); for(i=0;i<M;i++){ for(j=0;j<N;j++) printf("%-5d",a[i][j]); printf("/n"); } for(i=0;i<M;i++){ b[i]=0; for(j=0;j<N;j++) if(b[i]<a[i][j]) b[i]=a[i][j]; } printf("矩阵b为:/n"); for(j=0;j<M;j++) printf("%-5d",b[j]); printf("/n"); }