(1)设矩阵A 的数据放在A.txt 中,B 矩阵数据放在B.txt 中,这两个矩阵的相乘结果放
在C.txt 中,执行程序:d:>cf.exe A.txt B.txt C.txt 则将结果输出到C.txt,并用Matlab 验证输出结果。
矩阵乘法需要注意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=0∑n−1aijbij,i=0,1,⋅⋅⋅,m−1;j=0,1,⋅⋅⋅,k−1
计算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 如图:
A.txt B.txt C.txt 文本文件如图:
给B.txt 多加一行数据验证,提示矩阵不可相乘如图:
程序中断,C.txt 保持不变,A.txt B.txt C.txt 文本文件如图:
用matlab 验证结果如图: