C语言实现文件读取矩阵乘法
生活随笔
收集整理的這篇文章主要介紹了
C语言实现文件读取矩阵乘法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
用C語言計算矩陣乘積
一、設計需求:
- 用命令行參數(shù)的形式編寫C語言程序
- 從A.txt和B.txt中讀取連個矩陣
- 需要判斷兩個矩陣能否相乘
- 把計算后的結(jié)果寫入到C.txt中
二、實現(xiàn)思路
- 1.用命令行參數(shù)把文件名傳給文件指針fp1、fp2、fp3
- 2.檢測一行文本中空格的個數(shù)和換行符的個數(shù),確定行和列并創(chuàng)建二維數(shù)組。
- 3.利用fscanf函數(shù)和兩層for循環(huán)把數(shù)據(jù)傳給二維數(shù)組
- 4.利用for循環(huán)對兩個二維數(shù)組進行計算,把結(jié)果傳給新的二維數(shù)組。
- 5.將新的二維數(shù)組一個個寫入到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; } //行數(shù)row,列數(shù)column int main(int argc ,char* argv[]) {//檢查用戶的參數(shù)是否正確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列\(zhòng)n", row1, column1);printf("矩陣B有%d行%d列\(zhòng)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;}}//顯示結(jié)果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; }五、試驗現(xiàn)象
- 在在A.txt和B.txt中輸入下列矩陣
在cmd中編譯并生成b.exe可執(zhí)行文件,輸入命令行運算,由于B矩陣不滿足矩陣乘法要求,故無法繼續(xù)相乘
更改B矩陣的值為3*3矩陣
再重新運行程序看看
打開C.txt查看輸出數(shù)值
我們?nèi)ATLAB中驗證一下矩陣相乘的結(jié)果正確與否,在控制臺輸入如下代碼:
查看輸出結(jié)果
計算是正確的
總結(jié)
以上是生活随笔為你收集整理的C语言实现文件读取矩阵乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java私有方法运用场景_java6-3
- 下一篇: 使用gnuplot绘制直方图