행렬곱

공부/자료구조 2021. 5. 9. 00:44
반응형
//Fn.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"Fn.h"


void printMatrix(int **Matrix, int m, int n){
	int m1, n1;
	for(m1=0;m1<m;m1++){
		for(n1=0;n1<n;n1++){
			if(n1 == n-1){
				printf("%d\n", Matrix[m1][n1]);
			}
			else
				printf("%d ", Matrix[m1][n1]);
		}
	}
}

//(m x n) matrix
void insertRand(int **Matrix, int m, int n){
	srand(time(NULL));
	int m1, n1;
	for(m1=0;m1<m;m1++){
		for(n1=0;n1<n;n1++){
			Matrix[m1][n1] = rand()%10000;
		}
	}
}

int** createMatrix(int m, int n){
	int **matrix;
	matrix = (int**)malloc(sizeof(int*)*m);
	for(int m1=0;m1<m;m1++){
		matrix[m1] = (int*)malloc(sizeof(int)*n);
	}
	
	return matrix;
}

void freeMatrix(int **matrix, int m, int n){
	int m1, n1;
	//arr[0][] ~~~~~~~~ a[m1][]
	for(m1=0;m1<m;m1++){
		free(matrix[m1]);
	}
	free(matrix);

}
//Fn.h

#include<stdio.h>

int** MultiplyMatrix(int **matrix1, int **matrix2, int m, int n, int q);
void printMatrix(int **Matrix, int m, int n);
void insertRand(int **Matrix, int m, int n);
int** createMatrix(int m, int n);
void freeMatrix(int **matrix, int m, int n);
void freeArr(int *arr);
//MatrixMultiplyTest.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"Fn.h"

void main(){
	//(m x n), (n x q)
	int m, n, q;
	int **Matrix1, **Matrix2, **result;
	clock_t start, end;
	float t;
	//seed
	srand(time(NULL));

	int i, j;
	//(100x100) ~ (599x599)
	for(j=100;j<600;j+=100){
		m = rand()%10 + j;
		n = rand()%10 + j;
		q = rand()%10 + j;
		printf("Matrix1(%dx%d) * Matrix2(%dx%d) \n",m,n,n,q); 
		//5times
		for(i=0;i<5;i++){
			//random m, n, q
			//create Matrix
			Matrix1 = createMatrix(m,n);
			Matrix2 = createMatrix(n,q);
			insertRand(Matrix1, m, n);
			insertRand(Matrix2, n, q);
		
			/*
			//show Matrix
			printf("=Matrix1=\n");
			printMatrix(Matrix1, m, n);
			printf("=Matrix2=\n");
			printMatrix(Matrix2, n, q);
				*/
	
			//start multiply
			start = clock();
			result = MultiplyMatrix(Matrix1, Matrix2, m, n, q);
			end = clock();
			t = (end - start)/CLOCKS_PER_SEC;
	
			/*
			//show MultiplyMatrix
			printf("=result=\n");
			printMatrix(result, m, q);
			*/
	
			//Time
			printf("Time : %.3f sec", t);
		
			freeMatrix(Matrix1, m, n);
			freeMatrix(Matrix2, n, q);
			freeMatrix(result, m, q);
		}
	}
}
//MultiplyMatrix.c

#include<stdio.h>
#include"Fn.h"
//(m x n) (n x q) => (m x q)
int** MultiplyMatrix(int **matrix1, int **matrix2, int m, int n, int q){
	int **result;
	int m1, n1, q1;
	int res;

	for(m1=0; m1<m; m1++){
		for(q1=0;q1<q;q1++){
			res = 0;
			for(n1=0;n1<n;n1++){
				res = res + matrix1[m1][n1]*matrix2[n1][q1];
			}
			result[m1][q1] = res;
		}
	}
	return result;
}

728x90
반응형
블로그 이미지

아상관없어

,