c语言学习进阶-C语言程序实现矩阵乘法

(1)设矩阵A 的数据放在A.txt 中,B 矩阵数据放在B.txt 中,这两个矩阵的相乘结果放
在C.txt 中,执行程序:d:>cf.exe A.txt B.txt C.txt 则将结果输出到C.txt,并用Matlab 验证输出结果。
c语言学习进阶-C语言程序实现矩阵乘法_第1张图片
c语言学习进阶-C语言程序实现矩阵乘法_第2张图片
矩阵乘法需要注意C=AB,可计算必须满足A矩阵为 m × n m\times n m×n,B矩阵为 n × k n\times k n×k,乘积C中的各元素为:
c i j = ∑ t = 0 n − 1 a i j b i j , i = 0,1, ⋅ ⋅ ⋅ , m − 1; j = 0,1, ⋅ ⋅ ⋅ , k − 1 c_{ij}=\sum_{t=0}^{n-1}{a_{ij}b_{ij},i=\text{0,1,}\cdot \cdot \cdot ,m-\text{1;}j=\text{0,1,}\cdot \cdot \cdot ,k-1} cij=t=0n1aijbij,i=0,1,,m1;j=0,1,,k1
计算C=AB的代码cf.c如下:

#include
#include 
#include 
#include 
#include  
#include
int main(int argc ,char *argv []) 
{ 
	int c1 ,column1 = 0,lines1 = 0; //fp1 的列与行,及矩阵A读出流赋值参数
	int c2 ,column2 = 0,lines2 = 0; //fp2 的列与行,及矩阵B读出流赋值参数
	int i ,k,g; 
	FILE *fp1,*fp2 ,*fp3 ;
	// 检查参数是否正确 
	if (argc != 4)
	{ 
		printf("用法:命令矩阵A文件名矩阵B文件名矩阵C文件名\n"); 
		return -1;
	}
	//检测A行数 
	fp1 = fopen(argv[1] ,"r");
	if (fp1 == NULL) 
	{ 
		printf("文件打开出错,请检查 !\n"); 
		exit (0); 
	} 
	while((c1 = fgetc(fp1))!= EOF)//是否到文件底部 
		{ 
		if (c1 == '\n')//检测A的行数 
		lines1++; 
		} 
	lines1 = lines1+1; 
	rewind(fp1 ); // 指针重回文件开头 
	//检测A列数 
	while((c1 = fgetc(fp1))!= EOF) 
		{ 
		if (c1 == ' ' || c1 =='\n') //统计每行元素个数
		column1++; 
		} 
	column1 = (column1+1)/lines1 ; //每行一循环
	rewind(fp1 );
	int a[ lines1 ][column1];//定义二维数组a存储A
	//检测 fp2 行数 
	fp2 = fopen(argv[2] ,"r"); 
	if (fp2 == NULL)
		{ 
		printf("文件打开出错,请检查!\n"); 
		exit (0); 
		} 
	while((c2 = fgetc(fp2))!= EOF) 
		{ 
		if (c2 == '\n') 
		lines2++; 
		} 
	lines2 = lines2+1; 
	rewind(fp2 ); // 指针重回文件开头 
	//检测 fp2 列数 
	while((c2 = fgetc(fp2))!= EOF) 
		{ 
		if (c2 ==' '|| c2 =='\n') 
		column2++; 
		} 
	column2 = (column2+1)/lines2 ; 
	rewind(fp2);
	int b[ lines2 ][column2];定义二维数组b存储B
	// 判断是否可以相乘 
	if (column1!= lines2) 
		{ 
		printf("矩阵无法相乘"); 
		exit (0); 
		}
	int c[ lines1 ][column2];
	//矩阵赋值 
	for(i=0;i<lines1;i++)
	for(k=0;k<column1;k++) 
		{ 
		fscanf(fp1 ,"%d",&a[i][k]); //从流中读出指定数据类型赋值给二维数组a
		} 
	for(i=0;i<lines2; i++) 
	for(k=0;k<column2;k++) 
		{ 
		fscanf(fp2 ,"%d",&b[i][k]);//从流中读出指定数据类型赋值给二维数组b 	
		}
	for(i=0;i<lines1;i++) 
	{ 
		for(k=0;k<column2;k++) 
		{ 
			c[i][k]=0; 
			for(g=0;g<column1;g++) 
			{ 
				c[i][k]+=a[i][g]*b[g][k]; //行列式计算							
			} //C矩阵为行为lines1,列为column2					
		//printf("c[%d][%d]=%d\n" ,i,k,c[i][k]);
		}
	} 
	fp3 = fopen(argv[3],"a");//计算后的结果写入文件
	for(i=0;i<lines1; i++) 
	{ 
		for(k=0;k<column2;k++) 
		{ 
		fprintf(fp3,"%d ",c[i][k]);
		} 
		fprintf(fp3 ,"\n");//换行 
	}
	fclose(fp1 );
	fclose(fp2 ); 
	fclose(fp3 ); 
	 return 0; 
	 	if (fclose(fp1)!=0);//关闭文件成功关闭则返回值为0
	{
		printf("文件 %s\n 关闭错误",argv[1]);
	}
	if (fclose(fp2)!=0);
	{
		printf("文件 %s\n 关闭错误",argv[2]);
	}
	if (fclose(fp3)!=0);
	{
		printf("文件 %s\n 关闭错误",argv[3]);
	}
}
//验证
//gcc cf.c -o cf.exe
//cf.exe A.txt D.txt C.txt
//cf.exe A.txt B.txt C.txt

命令行编译cf.c 运行程序cf.exe A.txt B.txt C.txt 如图:
c语言学习进阶-C语言程序实现矩阵乘法_第3张图片
A.txt B.txt C.txt 文本文件如图:
c语言学习进阶-C语言程序实现矩阵乘法_第4张图片
给B.txt 多加一行数据验证,提示矩阵不可相乘如图:
在这里插入图片描述程序中断,C.txt 保持不变,A.txt B.txt C.txt 文本文件如图:
c语言学习进阶-C语言程序实现矩阵乘法_第5张图片
用matlab 验证结果如图:

c语言学习进阶-C语言程序实现矩阵乘法_第6张图片

你可能感兴趣的:(C语言,c语言,矩阵,开发语言)