用C语言计算矩阵乘积

一、设计需求:

  • 用命令行参数的形式编写C语言程序
  • 从A.txt和B.txt中读取连个矩阵
  • 需要判断两个矩阵能否相乘
  • 把计算后的结果写入到C.txt中

二、实现思路

  • 1.用命令行参数把文件名传给文件指针fp1、fp2、fp3
  • 2.检测一行文本中空格的个数和换行符的个数,确定行和列并创建二维数组。
  • 3.利用fscanf函数和两层for循环把数据传给二维数组
  • 4.利用for循环对两个二维数组进行计算,把结果传给新的二维数组。
  • 5.将新的二维数组一个个写入到C.txt中

三、矩阵乘法的定义

设A为m×p矩阵,B为的p×n的矩阵,那么称m×n的矩阵C为A与B的乘积,记作C=AB,其中矩阵C中第i行第j列元素可以表示为:设A为m \times p 矩阵,B为的p \times n的矩阵,那么称m\times n的矩阵C为A与B的乘积,记作C=AB,其中矩阵C中第i行第j列元素可以表示为:设A为m×p矩阵,B为的p×n的矩阵,那么称m×n的矩阵C为A与B的乘积,记作C=AB,其中矩阵C中第i行第j列元素可以表示为:
(AB)ij=∑k=1paikbkj=ai1b1j+ai2b2j+⋯+aipbpj(AB)_{ij}=\sum_{k=1}^{p}a_{ik}b_{kj}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots+a_{ip}b_{pj} (AB)ij​=k=1∑p​aik​bkj​=ai1​b1j​+ai2​b2j​+⋯+aip​bpj​

四、源代码

#include<stdio.h>
#include<stdlib.h>
//读取矩阵有几行
int read_row(FILE* fp) {//fp = fopen("A.txt", "r");int c, m = 0;while ((c = fgetc(fp)) != EOF)if (c == '\n'){m++;}m++;rewind(fp);return m;
}int read_rank(FILE* fp) //读取有几列
{int n = 0, c;while ((c = fgetc(fp)) != '\n')if (c == ' ')n++;n++;rewind(fp);return n;
}
//行数row,列数column
int main(int argc ,char* argv[])
{//检查用户的参数是否正确if (argc != 4){printf("用法:命令 矩阵1 矩阵2 输出矩阵\n");return -1;}FILE* fp1, * fp2, * fp3;fp1 = fopen(argv[1], "r");fp2 = fopen(argv[2], "r");fp3 = fopen(argv[3], "w");if (fp1 && fp2 == NULL){printf("file is error.");return -1;}int row1 = 0, column1 = 0, row2 = 0, column2 = 0;row1 = read_row(fp1);column1 = read_rank(fp1);row2 = read_row(fp2);column2 = read_rank(fp2);printf("矩阵A有%d行%d列\n", row1, column1);printf("矩阵B有%d行%d列\n", row2, column2);int a[row1][column1];int b[row2][column2];//判断矩阵能否相乘if (row1 != column2){printf("矩阵无法相乘!");exit(0);}int c[column1][row2];if (fp1 && fp2 == NULL){printf("文件不存在!");exit(0);}//输入矩阵Afor (int i = 0; i < row1; i++){for (int j = 0; j < column1; j++){fscanf(fp1, "%d", &a[i][j]);}}fclose(fp1);//控制台输出矩阵Afor (int i = 0; i < row1; i++){for (int j = 0; j < column1; j++){printf("%d ", a[i][j]);}printf("\n");}printf("\n");printf("矩阵A输出完毕\n");//输入矩阵Bfor (int i = 0; i < row1; i++){for (int j = 0; j < column2; j++){fscanf(fp2, "%d", &b[i][j]);}}fclose(fp2);//控制台输出矩阵Bfor (int i = 0; i < row1; i++){for (int j = 0; j < column2; j++){printf("%d ", b[i][j]);}printf("\n");}printf("\n");printf("矩阵B输出完毕\n");//乘法for (int i = 0;i < column1;i++){for (int j = 0;j < row2;j++){int sum = 0;for (int k = 0;k < row2;k++){sum = sum + a[i][k] * b[k][j];}c[i][j] = sum;}}//显示结果for (int i = 0;i < column1; i++){for (int j = 0;j < row2;j++){printf("%d ", c[i][j]);fprintf(fp3, "%d ", c[i][j]);}printf("\n");fprintf(fp3, "\n");}return 0;
}

五、试验现象

  • 在在A.txt和B.txt中输入下列矩阵
    在cmd中编译并生成b.exe可执行文件,输入命令行运算,由于B矩阵不满足矩阵乘法要求,故无法继续相乘
    更改B矩阵的值为3*3矩阵

    再重新运行程序看看

    打开C.txt查看输出数值

    我们去MATLAB中验证一下矩阵相乘的结果正确与否,在控制台输入如下代码:
A = [1 2 3;4 5 6;7 8 9]
B = [1 2 3;4 1 6;7 8 1]
C = A*B

查看输出结果

计算是正确的

C语言实现文件读取矩阵乘法相关推荐

  1. C语言的文件读取与写入操作

    学了一年的C语言了,现在回过头来做一下总结.并且博客开了挺长一段时间却没有谢什么实际的东西.现在做下总结,对之后的学习帮助应该挺大的.与大家共勉! 现在,我先来介绍一下C语言的文件读取与写入的原理和具 ...

  2. 多线程读取矩阵文件+多线程矩阵乘法(C++实现)

    算法概述 矩阵乘法可以在算法层面上进行并行. vector< vector > Mat[3]; 这个二维向量数组就是来放做矩阵乘法中的那些矩阵的.Mat[0]是矩阵A,Mat[1]是矩阵B ...

  3. 西北乱跑娃 --- 易语言大文件读取

    为了读取大文件翻遍了很多网站,都说要使用打开文件属性,让人难以抓住问题解决的核心,值得吐槽的就是易语言收费的特质,去哪里下载以及解决问题都是跌跌斑斑.确实很让人费神,现在把大文件读取写到这里. 一.定 ...

  4. mpi大规模矩阵乘法C语言,MPI多进程并行计算矩阵乘法实现

    MPI多进程并行计算矩阵乘法实现,对原始矩阵A.B进行初始化算为: 其主要思想:是把相乘的矩阵按行分解(任务分解),分别分给不同的进程,然后在汇总到一个进程上,在程序上实现则用到了主从模式,人为的把进 ...

  5. c语言awx文件读取,气象卫星分发产品及其格式规范AWX2.1(数据格式C语言).doc

    气象卫星分发产品AWX及其格式规范,通过本文方法可以读取该格式文件内容. 3.3第一级文件头记录格式 表1.4 一级文件头记录结构 序号字节序号字节数类型描述字备注11-1212Char×12Sat ...

  6. 用c语言对文件读取,并使用链表,和顺序表进行存储,操作

    有一些,经典的对文件的操作. fin = fopen ( argv[1], "rt" );//获取文件的指针 if ( fin == NULL )//判断是否为空 { fprint ...

  7. c语言两个3x3矩阵乘法,c语言矩阵相乘

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序清单 #include&nbsp int&nbspmain(void) { &nbsp&nbsp&nbsp&a ...

  8. c语言课程设计 矩阵乘法,C语言课程设计(论文)-矩阵乘法.doc

    C语言课程设计(论文)-矩阵乘法 学 号: 课 程 设 计 题 目矩阵乘法 教 学 院计算机学院 专 业09计算机科学与技术 班 级09计科(1)班 姓 名 指导教师 2010年12月25日 课程设计 ...

  9. r语言导出文件为xlxs_R语言学习——R读取txt、csv、xls和xlsx格式文件

    最近项目中运用到了R读取文件数据,所以把相关好用的.经过验证的方法总结了一下,有效避免下次入坑. 1. R读取txt文件 使用R读取txt文件直接使用read.table()方法进行读取即可,不需要加 ...

最新文章

  1. 数据结构与算法-学习笔记(13)
  2. 4.3---建立高度最小二叉树
  3. 在Linux中某些程序无法运行,为何linux下的程序不能在windows下运行,不是“废话”那么简单...
  4. CPU流水线的探秘之旅
  5. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
  6. (一)Hyperledger Fabric 1.1安装部署-基础环境搭建
  7. ESP8266-01学习笔记01:如何使用USB转串口对ESP-01进行入门调试、烧录固件?
  8. Lazarus安装使用
  9. 程序员面试金典 - 面试题 16.04. 井字游戏(计数)
  10. java中死锁_关于java中死锁的总结
  11. scrum项目协作是什么_什么是小型Scrum?
  12. 反转dataframe
  13. android之Uniapp之Weex之module开发
  14. 2021-08-12初识maven
  15. eeprom和编程器固件 k2_斐讯K2编程器刷breed换固件小白教程
  16. 单片机之矩阵键盘(花样编程)
  17. 天正电气lisp是什么文件_天正电气——那些隐蔽却好用的功能
  18. linux 错误信息不输出
  19. 安卓机顶盒刷linux系统下载,安卓机顶盒刷机 最简单的刷机教程【图文教程】
  20. 成熟好用的电池供电切换电路

热门文章

  1. EJS学习(五)之EJS的CommonJs规范版本
  2. Spring MVC -- 国际化
  3. mysql五种日期函数
  4. 【设计模式】——工厂方法FactoryMethod
  5. String 转 const char*
  6. 读《移山之道》的收获与疑问(阅读作业之刘明篇)
  7. JAVA连接MYSQL数据库
  8. unity------------------------------transform.forward与Vector.forward的区别
  9. [ACM] hdu 1285 确定比赛名次 (拓扑排序)
  10. junit4 javaee 5.0 jpa SSH 单元测试问题集锦