使用C语言编写矩阵乘法程序
请编写一个程序计算两个任意阶2维矩阵相乘。要求:
1、程序中应包含以下三个函数:(这里只给出函数名字,函数的类型和形参由学生确定)
LoadMatrix – 从文件读入矩阵数据
MatrixMutiply – 计算两个矩阵相乘
OutputMatrix – 将矩阵存储到输出文件中,同时在显示器上显示
2、不能使用全局变量
3、存储矩阵数据的文件和输出文件的格式如图1、图2和图3 所示:(假设存储矩阵A、矩阵B和输出文件分别为:MatrixA.txt、MatrixB.txt和MatrixC.txt)
主程序的主流程图
// 矩阵乘法.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;
}