typedef struct
{
int m
int n
int array[100][100]
}Ju_def
int main()
{
Ju_def Ju[11]
int i=0,m,n,k
int flag[10]
while(1)
{
flag[i]=0
printf("In put m and n:\n")
scanf("%d%d",&Ju[i].m,&Ju[i].n)
while(Ju[i].m<=0||Ju[i].m>100||Ju[i].n<=0||Ju[i].m>100)
{
printf("In put m and n again:\n")
scanf("%d%d",&Ju[i].m,&Ju[i].n)
}
printf("In put your array:\n")
for(m=0m<Ju[i].mm++)
{
for(n=0n<Ju[i].nn++)
{
scanf("%d",&Ju[i].array[m][n])
if(Ju[i].array[m][n]==0)
flag[i]++
}
}
if(flag[i]==(Ju[i].m*Ju[i].n))//矩阵元素全为0才退出循环
{
flag[i]=1
break
}
else
flag[i]=0
i++
i=i%10//超过10个矩阵,则又循环到第1个。
}
for(i=1i<10i++)
{
if((Ju[i].m!=Ju[0].n)&&(flag[i]==0))
{
printf("Not satisfied the definition of matrix multiplication !\n")
return 0
}
if(flag[i])
{
break
}
for(m=0m<Ju[0].mm++)
{
for(n=0n<Ju[0].nn++)
{
Ju[10].array[m][n]=0
for(k=0k<Ju[i].mk++)
{
Ju[10].array[m][n]+=Ju[0].array[m][n]*Ju[i].array[k][n]
}
Ju[0].array[m][n]=Ju[10].array[m][n]
}
}
}
for(m=0m<Ju[0].mm++)
{
for(n=0n<Ju[0].nn++)
{
printf("%-8d",Ju[0].array[m][n])
}
printf("\n")
}
}
你试试这个我的矩阵乘法是这样的了,A=A*B*C...(10个以内)。
C语言实现矩阵相乘
问题描述:
编写程序,可以实现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
/*矩阵最大行数和列数*/
问题的输入:
int
m,n,p
/*相乘的两个矩阵的行列数*/
long
lMatrix1[MAX][MAX],lMatrix2[MAX][MAX]
/*相乘的两个矩阵*/
问题的输出:
long
lMatrixResult[MAX][MAX]
/*矩阵相乘后得到的矩阵*/
初始算法
1.输入两个矩阵的的行列数m,n,p;
2.输入第一个矩阵的每个元素;
3.输入第二个矩阵的每个元素;
4.调用函数进行乘法运算,结果放在lMatrixResult
中;
5.
打印输出结果矩阵。
算法细化
算法的步骤4计算两个矩阵的乘法算法如下:
4.1
定义循环变量i,j,k
4.2
嵌套循环计算结果矩阵(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=0i<mi++)
for(j=0j<pj++)
{
/*按照矩阵乘法的规则计算结果矩阵的i*j元素*/
lSum=0
for(k=0k<nk++)
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("\nPlease
input
m
of
Matrix1:\n")
scanf("%d",&m)
printf("Please
input
n
of
Matrix1:\n")
scanf("%d",&n)
printf("Please
input
p
of
Matrix2:\n")
scanf("%d",&p)
/*输入第一个矩阵的每个元素*/
printf("\nPlease
elements
of
Matrix1(%d*%d):\n",m,n)
for(i=0i<mi++)
for(j=0j<nj++)
{
scanf("%ld",&lTemp)
lMatrix1[i][j]=lTemp
}
/*输入第二个矩阵的每个元素*/
printf("\nPlease
elements
of
Matrix2(%d*%d):\n",n,p)
for(i=0i<ni++)
for(j=0j<pj++)
{
scanf("%ld",&lTemp)
lMatrix2[i][j]=lTemp
}
/*调用函数进行乘法运算,结果放在lMatrixResult
中*/
MatrixMutiply(m,n,p,lMatrix1,lMatrix2,lMatrixResult)
/*打印输出结果矩阵*/
printf("\nResult
matrix:
\n")
for(i=0i<mi++)
{
for(j=0j<pj++)
printf("%ld
",lMatrixResult[i][j])
printf("\n")
}
}
程序运行结果如下:
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
#include <stdio.h>int main()
{
int x,y,z
int i,j,l
int sum=0
printf("请输入前一个矩阵的行数,列数与后一个矩阵的列数:\n")
scanf("%d %d %d",&x,&y,&z)
int a[x][y]
int b[y][z]
int c[x][z]
//读入矩阵
printf("请输入矩阵a:\n")
for(i=0i<xi++){
for(j=0j<yj++){
scanf("%d",&a[i][j])
}
}
printf("请输入矩阵b:\n")
for(i=0i<yi++){
for(j=0j<zj++){
scanf("%d",&b[i][j])
}
}
printf("矩阵a为:\n")
for(i=0i<xi++){
for(j=0j<yj++){
printf("%d",a[i][j])
if(j==y-1)
printf("\n")
else
printf("\t")
}
}
printf("矩阵b为:\n")
for(i=0i<yi++){
for(j=0j<zj++){
printf("%d",b[i][j])
if(j==z-1)
printf("\n")
else
printf("\t")
}
}
for(i=0i<xi++){
for(l=0l<zl++){
for(j=0j<yj++){
sum+=a[i][j]*b[j][l]
if(j==y-1){
c[i][l]=sum,sum=0
}
}
}
}
printf("矩阵a与矩阵b的乘积为:\n")
for(i=0i<xi++){
for(j=0j<zj++){
printf("%d",c[i][j])
if(j==z-1)
printf("\n")
else
printf("\t")
}
}
return 0
}