|
60鱼币
[ 本帖最后由 teredoo 于 2022-10-2 16:02 编辑 ]\n\n各位大佬,这个是我写的代码,是想实现矩阵乘法,但是我在实践的过程中发现实现矩阵乘的代码(标注红色的部分)在未知条件下会把我已经赋过值的第二个矩阵的第一个元素变成零(其他元素不变),此段代码中并没有对除第三个矩阵外的的元素进行赋值。为什么会出现这样的情况 各位帮我看看吧
#include<stdio.h>
int main()
{
int FML,FMH,SML,SMH,i,j,k,flag,num=0;
printf("输入第一个矩阵的尺寸:(行*列)");
scanf("%d*%d",&FMH,&FML);
getchar();
printf("输入第二个矩阵尺寸:(行*列)");
scanf("%d*%d",&SMH,&SML);
getchar();
int Fmatrix[FMH][FML];//第一个矩阵
int Smatrix[SMH][SML];//第二个矩阵
int Tmatrix[FMH][SML];//矩阵乘后的矩阵
printf("输入第一个矩阵的值:\n");
for(i = 0;i<FMH;i++)
{
for(j = 0;j<FML;j++)
{
Fmatrix[i][j] = getchar();
}
getchar();
}
for(i = 0;i<FMH;i++)//getchar值处理 第一个矩阵
{
for(j = 0;j<FML;j++)
{
Fmatrix[i][j]=Fmatrix[i][j]-48 ;
}
} //
printf("输入第二个矩阵的值:\n");
for(i = 0;i<SMH;i++)
{
for(j = 0;j<SML;j++)
{
Smatrix[i][j] = getchar();
}
getchar();
}
for(i = 0;i<SMH;i++)//getchar值处理 第二个矩阵
{
for(j = 0;j<SML;j++)
{
Smatrix[i][j]=Smatrix[i][j]-48 ;
}
} //
printf("%d\n",Smatrix[0][0]);//测试 第二个矩阵第一个元素的值(此时测试输出的值还是我赋给它的值)
for(i = 0;i<FML;i++)//初始化Tmatrix 初始化第三个矩阵
{
for(j = 0;j<SMH;j++)
{
Tmatrix[i][j] = 0;
}
}
printf("进行矩阵乘\n");
[color=Red] //计算矩阵乘 (我个人排查后认为问题就出在这段代码中,未知条件下会把第二个矩阵第一个元素的值变成零)
{for(i=0;i<FMH;i++)//计算矩阵乘
{
for(j=0,k=0;j<SML;j++,k++)
{
for(flag=0;flag<SMH;flag++)
{
Tmatrix[i][k] = Tmatrix[i][k] + Fmatrix[i][flag] * Smatrix[flag][j];
}
}
}[/color]
printf("%d\n",Smatrix[0][0]);//测试
本帖最后由 jackz007 于 2022-10-2 15:33 编辑
- #include <stdio.h>
- int main(void)
- {
- int m , n , p , q ;
- int i , j , k , x , row ;
- printf("请输入第一个矩阵的尺寸(M*P) : ") ;
- scanf("%d*%d" , & m , & p) ;
- printf("请输入第二个矩阵的尺寸(P*N) : ") ;
- scanf("%d*%d" , & q , & n) ;
- if(p != q) printf("矩阵尺寸不能计算") ;
- int array1[m][p] , array2[p][n] , array3[m][n] ;
- printf("请输入第一个矩阵的值:\n") ;
- for(i = 0 ; i < m ; i ++) for(j = 0 ; j < p ; j ++) scanf("%d" , & array1[i][j]) ;
- printf("请输入第二个矩阵的值:\n") ;
- for(i = 0 ; i < p ; i ++) for(j = 0 ; j < n ; j ++) scanf("%d" , & array2[i][j]) ;
- //计算矩阵值
- for(i = 0 ; i < m ; i ++) for(j = 0 ; j < n ; j ++) array3[i][j] = 0 ;
- //矩阵相乘计算
- for(i = 0 ; i < m ; i ++) {
- for(j = 0 ; j < n ; j ++) {
- for(k = 0 ; k < p ; k ++) {
- array3[i][j] += array1[i][k] * array2[k][j] ;
- }
- }
- }
- //输出
- row = m > p ? m : p ;
- for(i = 0 ; i < row ; i ++) {
- //打印第一个矩阵行
- if(i < m) printf("| %d" , array1[i][0]) ;
- else printf(" ") ;
- for(j = 1 ; j < p ; j ++) {
- if(i < m) printf(" %d" , array1[i][j]) ;
- else printf(" ") ;
- }
- if(i < m) printf(" |") ;
- else printf(" ") ;
- //打印*号
- if(i == row / 2) printf(" * ") ;
- else printf(" " ) ;
- //打印第二个矩阵行
- if(i < p) printf("| %d" , array2[i][0]) ;
- else printf(" ") ;
- for(j = 1 ; j < n ; j ++) {
- if(i < p) printf(" %d" , array2[i][j]) ;
- else printf(" ") ;
- }
- if(i < p) printf(" |") ;
- else printf(" ") ;
- //打印=号
- if(i == row / 2) printf(" = ") ;
- else printf(" ") ;
- //打印第三个矩阵行
- if(i < m) printf("| %2d" , array3[i][0]) ;
- else printf(" ") ;
- for(j = 0 ; j < n ; j ++) {
- if(i < m) printf(" %2d" , array3[i][j]) ;
- else printf(" ") ;
- }
- if(i < m) printf(" |") ;
- else printf(" ") ;
- printf("\n") ;
- }
- }
复制代码
编译、运行实况:
- D:\[00.Exerciese.2022]\C>g++ -o x x.c
- D:\[00.Exerciese.2022]\C>x
- 请输入第一个矩阵的尺寸(M*P) : 4*5
- 请输入第二个矩阵的尺寸(P*N) : 5*8
- 请输入第一个矩阵的值:
- 1 2 3 4 5
- 2 2 2 2 2
- 3 3 3 3 3
- 5 4 3 2 1
- 请输入第二个矩阵的值:
- 8 7 6 5 4 3 2 1
- 1 1 1 1 1 1 1 1
- 2 2 2 2 2 2 2 2
- 3 3 3 3 3 3 3 3
- 1 2 3 4 5 6 7 8
- | 1 2 3 4 5 | | 8 7 6 5 4 3 2 1 | | 33 33 37 41 45 49 53 57 61 |
- | 2 2 2 2 2 | | 1 1 1 1 1 1 1 1 | | 30 30 30 30 30 30 30 30 30 |
- | 3 3 3 3 3 | * | 2 2 2 2 2 2 2 2 | = | 45 45 45 45 45 45 45 45 45 |
- | 5 4 3 2 1 | | 3 3 3 3 3 3 3 3 | | 57 57 53 49 45 41 37 33 29 |
- | 1 2 3 4 5 6 7 8 |
- D:\[00.Exerciese.2022]\C>
复制代码
|
|