日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现文件读取矩阵乘法

發(fā)布時(shí)間:2025/3/12 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现文件读取矩阵乘法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

用C語言計(jì)算矩陣乘積

一、設(shè)計(jì)需求:

  • 用命令行參數(shù)的形式編寫C語言程序
  • 從A.txt和B.txt中讀取連個矩陣
  • 需要判斷兩個矩陣能否相乘
  • 把計(jì)算后的結(jié)果寫入到C.txt中

二、實(shí)現(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ù)組進(jìn)行計(jì)算,把結(jié)果傳給新的二維數(shù)組。
  • 5.將新的二維數(shù)組一個個寫入到C.txt中

三、矩陣乘法的定義

設(shè)A為m×p矩陣,B為的p×n的矩陣,那么稱m×n的矩陣C為A與B的乘積,記作C=AB,其中矩陣C中第i行第j列元素可以表示為:設(shè)A為m \times p 矩陣,B為的p \times n的矩陣,那么稱m\times n的矩陣C為A與B的乘積,記作C=AB,其中矩陣C中第i行第j列元素可以表示為:設(shè)Am×p,Bp×nm×nCAB,C=AB,Cij:
(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=1p?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; }

五、試驗(yàn)現(xiàn)象

  • 在在A.txt和B.txt中輸入下列矩陣
    在cmd中編譯并生成b.exe可執(zhí)行文件,輸入命令行運(yùn)算,由于B矩陣不滿足矩陣乘法要求,故無法繼續(xù)相乘
    更改B矩陣的值為3*3矩陣

    再重新運(yùn)行程序看看

    打開C.txt查看輸出數(shù)值

    我們?nèi)ATLAB中驗(yàn)證一下矩陣相乘的結(jié)果正確與否,在控制臺輸入如下代碼:
A = [1 2 3;4 5 6;7 8 9] B = [1 2 3;4 1 6;7 8 1] C = A*B

查看輸出結(jié)果

計(jì)算是正確的

總結(jié)

以上是生活随笔為你收集整理的C语言实现文件读取矩阵乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。