使用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 <stdlib.h>
#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;
}
posted @ 2021-03-06 15:04  Clancy_gang  阅读(806)  评论(0)    收藏  举报