使用C语言编写矩阵乘法程序

使用C语言编写矩阵乘法程序

请编写一个程序计算两个任意阶2维矩阵相乘。要求:

1、程序中应包含以下三个函数:(这里只给出函数名字,函数的类型和形参由学生确定)

LoadMatrix – 从文件读入矩阵数据

MatrixMutiply – 计算两个矩阵相乘

OutputMatrix – 将矩阵存储到输出文件中,同时在显示器上显示

2、不能使用全局变量

3、存储矩阵数据的文件和输出文件的格式如图1、图2和图3 所示:(假设存储矩阵A、矩阵B和输出文件分别为:MatrixA.txt、MatrixB.txt和MatrixC.txt)

image-20210306145027033 image-20210306145046774 image-20210306145105536
主程序的主流程图
image-20210306145149740
// 矩阵乘法.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include 
#define MAX_PATH  200
float*  LoatMatrix(char* file_name, int *r_width, int *r_heigh);
float*  MatrixMutiply(float *ma, float *mb, int a_wid, int a_hei, int b_wid);
void   OutputMatrix(char* fileName, float *mc, int wid, int hei);float* MatrixMutiply(float *ma, float *mb, int a_wid, int a_hei, int b_wid) {float *d_p = (float*)malloc(b_wid * a_hei * sizeof(float));if (!d_p) {return NULL;}for (int i = 0; i < a_hei; ++i) {for (int j = 0; j < b_wid; ++j) {d_p[i * b_wid + j] = 0;for (int k = 0; k < a_wid; ++k) {d_p[i * b_wid + j] += ma[i * a_wid + k] * mb[k * b_wid + j];}}}return d_p;
}float* LoatMatrix(char* file_name, int *r_width, int *r_heigh) {FILE *pf = NULL;fopen_s(&pf, file_name, "r");*r_width = *r_heigh = 0;if (!pf) {fclose(pf);return NULL;}float f_b;int wid = 0, hei = 0;while (fscanf_s(pf, "%f", &f_b) != EOF) {if (!hei) {wid++;}if (fgetc(pf) == '\n' || fgetc(pf) == EOF) {hei++;}}float *d_ptr = (float*)malloc(wid * hei * sizeof(float));if (!d_ptr) {fclose(pf);return NULL;}fclose(pf);fopen_s(&pf, file_name, "r");for (int i = 0; i < hei; ++i) {for (int j = 0; j < wid; ++j) {fscanf_s(pf, "%f", &d_ptr[i * wid + j]);}}*r_width = wid;*r_heigh = hei;fclose(pf);return d_ptr;
}void OutputMatrix(char* fileName, float *mc, int wid, int hei) {FILE *pf = NULL;fopen_s(&pf, fileName, "w");for (int i = 0; i < hei; ++i) {for (int j = 0; j < wid; ++j) {printf("%8.2f ", mc[i * wid + j]);fprintf(pf, "%8.2f ", mc[i * wid + j]);}printf("\n");fprintf(pf, "\n");}fclose(pf);
}int main() {char MaA[MAX_PATH], MaB[MAX_PATH], MaC[MAX_PATH];printf("Please enter the 3 file's names of matrix:\n");scanf_s("%s", MaA, MAX_PATH);scanf_s("%s", MaB, MAX_PATH);scanf_s("%s", MaC, MAX_PATH);float *MatrixA, *MatrixB;int W_a, W_b, H_a, H_b;MatrixA = LoatMatrix(MaA, &W_a, &H_a);MatrixB = LoatMatrix(MaB, &W_b, &H_b);if (!(MatrixA || MatrixB)) {printf("Wrong File!\n");return 0;}if (W_a == H_b) {int W_c = W_b, H_c = H_a;float *MatrixC = MatrixMutiply(MatrixA, MatrixB, W_a, H_a, W_b);if (!MatrixC) {printf("Wrong malloc!\n");return 0;}OutputMatrix(MaC, MatrixC, W_c, H_c);free(MatrixA);free(MatrixB);free(MatrixC);}else {free(MatrixA);free(MatrixB);printf("Wrong Selection!\n");return 0;}return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部