c언어 행렬 구현
#include <stdio.h>
typedef int Matrix;
#define ROW 2
#define COL 2
#define X *
#define TRUE 1
#define FALSE 0
//------------------ << Function >> ---------------------------
//Func[1]
void data_input(int (*arr)[2], int (*brr)[2]);
//Func[2]
void Matrix_Multiplication(int (*arr)[2], int (*brr)[2], int (*crr)[2]);
//Func[3]
int Matrix_Determin(int (*tmp)[2]);
//Func[4]
void Inverse_Matrix(int (*tmp)[2]);
//----------------- << Main >> --------------------------
int main(void){
Matrix A_MA[ROW][COL];
Matrix B_MA[ROW][COL];
Matrix C_MA[ROW][COL];
int indexi, indexj;
//initiallize ------------------------------------
for (indexi = 0; indexi< ROW; indexi++) {
for (indexj = 0; indexj< COL; indexj++) {
A_MA[indexi][indexj] = 0;
B_MA[indexi][indexj] = 0;
C_MA[indexi][indexj] = 0;
}
}
//------------------------------------------------
data_input(A_MA, B_MA);
Matrix_Multiplication(A_MA, B_MA, C_MA);
Inverse_Matrix(A_MA);
return 0;
}
//----------------<< Func[1] >>----------------------
void data_input(int (*arr)[2], int (*brr)[2]) {
//[1] arr[ROW][COL] data input!!!!
int i, j;
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("arr[%d][%d] input >>> ", i, j);
scanf("%d", &arr[i][j]);
}
}
//[2] brr[ROW][COL] data input!!!!
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("brr[%d][%d] input >>> ", i, j);
scanf("%d", &brr[i][j]);
}
}
//[3] arr[ROW][COL] data printf!!!!
printf(" ------------<< arr >>-------------- \n");
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("arr[%2d][%2d] = [%2d] ", i, j, *(*(arr+i)+j));
if( j == COL-1) printf("\n");
}
}
//[4] brr[ROW][COL] data printf!!!!
printf(" ------------<< brr >>-------------- \n");
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("brr[%2d][%2d] = [%2d] ", i, j, *(*(brr+i)+j));
if( j== COL-1) printf("\n");
}
}
}
void Matrix_Multiplication(int (*arr)[2], int (*brr)[2], int (*crr)[2]) {
int i, j, k;
int sum = 0;
for (k = 0; k<2; k++) {
for (i=0; i<ROW; i++) {
for (j = 0; j<COL; j++) {
sum = sum + *(*(arr+k)+j) X *(*(brr+j)+i);
// 00 * 00 + 01 * 10
// 00 * 01 + 01 * 11
// 10 * 00 + 11 * 10
// 10 * 01 + 11 * 11
}
*(*(crr+k)+ i) = sum;
sum = 0;
}
}
printf(" ------------<< crr >>-------------- \n");
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("crr[%2d][%2d] = [%2d] ", i, j, *(*(crr+i)+j));
if( j== COL-1) printf("\n");
}
}
}
int Matrix_Determin(int (*tmp)[2]) {
/*
A = [ a11 a12]
[ a21 a22]
det(A) = a11*a22 - a12*a21
*/
int determin = 0;
determin = tmp[0][0]*tmp[1][1] - tmp[0][1]*tmp[1][0] ;
printf("determin is [%d] \n", determin);
if ( determin == 0 ) return FALSE;
else return determin;
}
void Inverse_Matrix(int (*tmp)[2]) {
int i, j;
int det = 0;
int tmp_i = 0;
det = Matrix_Determin(tmp);
if(det == 0){
printf(" not inverse \n");
return;//END
}
else
{ printf("inverse\n");
/*
1/D(A) [ a22 -a12]
[-a21 a11]
*/
tmp_i = tmp[0][0];
tmp[0][0] = tmp[1][1];
tmp[1][1] = tmp_i;
tmp[0][1] = (-1) X tmp[0][1];
tmp[1][0] = (-1) X tmp[1][0];
for(i = 0; i<ROW; i++) {
for(j = 0; j<COL; j++) {
printf("[%2d] / det[%2d] ", tmp[i][j],det);
if(j== COL-1) printf("\n");
}
}
}
}