Data_Structure/作業/unit1/matrix multiplication/read_matrix.c
2025-01-20 21:30:53 +08:00

161 lines
3.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void mul(int **a, int **b, int **c, int m, int k, int n) {
int i , j , l ;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
c[i][j] = 0;
for (l = 0; l < k; l++) {
c[i][j] += a[i][l] * b[l][j];
}
}
}
}
void read_matrix(FILE *file,int *m,int *k,int *n){
char line[1000];
// int *m = 0, *k1 = 0, *k2 = 0, *n = 0;
int *k1 , *k2;
int i, j, temp;
char *token;
while (fgets(line, sizeof(line), file)) {
if (strlen(line) <= 1) {
break;
}
j = 0;
token = strtok(line, " \n");
while (token != NULL) {
j++;
token = strtok(NULL, " \n");
}
if (*k1 == 0) *k1 = j;
m++;
}
// 讀取第二個矩陣
while (fgets(line, sizeof(line), file)) {
j = 0;
token = strtok(line, " \n");
while (token != NULL) {
j++;
token = strtok(NULL, " \n");
}
if (*n == 0) *n = j;
k2++;
*k2 = k2;
}
printf("OK");
// if (*k1!=*k2) return 1;
// if (*k1==*k2){
}
int main() {
FILE *file ;
int *m , *k , *n ;
int i, j, temp;
char *token;
if ((file = fopen("matrix_input.txt", "r")) == NULL){
printf("無法打開文件\n");
return 1;
}
// 讀取第一個矩陣
// while (fgets(line, sizeof(line), file)) {
// if (strlen(line) <= 1) {
// break;
// }
// j = 0;
// token = strtok(line, " \n");
// while (token != NULL) {
// j++;
// token = strtok(NULL, " \n");
// }
// if (k1 == 0) k1 = j;
//
// m++;
// }
//
// // 讀取第二個矩陣
// while (fgets(line, sizeof(line), file)) {
// j = 0;
// token = strtok(line, " \n");
// while (token != NULL) {
// j++;
// token = strtok(NULL, " \n");
// }
// if (n == 0) n = j;
// k2++;
// }
read_matrix(file,&m,&k,&n);
printf("第一個矩陣: %d 行 %d 列\n", *m, *k);
printf("第二個矩陣: %d 行 %d 列\n", *k, *n);
printf("m = %d, k1 = %d, k2 = %d, n = %d\n\n", *m, *k , *k , *n);
//根據m,k,n配置記憶體空間
int **arr_a = (int**)malloc(m * sizeof(int*));
int **arr_b = (int**)malloc(k * sizeof(int*));
int **arr_c = (int**)malloc(m * sizeof(int*));
for(i=0;i<m;i++){
arr_a[i] = (int*)malloc(k*sizeof(int));
arr_c[i] = (int*)malloc(n*sizeof(int));
}
for(i=0;i<k;i++){
arr_b[i] = (int*)malloc(n*sizeof(int));
}
// for (i = 0; i < m; i++) {
// for (j = 0; j < k1; j++) {
// arr_a[i][j] = matrix1[i][j];
// }
// }
//
// for (i = 0; i < k2; i++) {
// for (j = 0; j < n; j++) {
// arr_b[i][j] = matrix2[i][j];
// }
// }
mul(arr_a,arr_b,arr_c,m,k,n);
// printf("%d\n",arr_a[0][1]);
// printf("%d\n",arr_b[0][1]);
// printf("%d\n",arr_c[0][1]);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("c[%d][%d]=%d\n",i,j,arr_c[i][j]);
}
}
fclose(file);
free (arr_a);
free (arr_b);
free (arr_c);
for(i=0;i<m;i++){
free (arr_a[i]);
free (arr_c[i]);
}
for(i=0;i<k;i++){
free (arr_b[i]);
}
// if(k1!=k2){
// printf("錯誤! 矩陣無法相乘\n");
// fclose(file);
// return 1;
// }
return 0;
}