c·c++/c 프로그래밍

동적할당 행렬의 곱셈

바로이순간 2012. 3. 24. 10:23

#include <stdio.h> 

#include <stdlib.h>

 

void mat_mul(int size[], double *a[], double *b[], double *c[]) {

  int i, j, k;

 

  double val;

  for(i=0;i<size[0];++i) {

    for(j=0;j<size[2];++j) {

      val=0;

      for(k=0; k<size[1]; ++k)

        val=val+a[i][k]*b[k][j];

      c[i][j]=val;

    }

  }

}

 

int main() {

  FILE *fin;

  int i,j,k; 

  double **arrA, **arrB, **arrC; //행렬 값의 주소를 넣을 포인터

  double *ptr;

  int temp[3];

 

  /* temp[3]: 배열의 크기 행, 열(행), 열 */

  fin = fopen("inp.txt","r");

  

  for(i=0;i<3;i++) {  //

    fscanf(fin,"%d",&temp[i]);

    printf("%d\n",temp[i]);

  }

 

 // *****배열 arrA, arrB, arrC 의 헤더를 위한 메모리 할당 ,, 열의 갯수만큼 필요

 

  arrA=(double **)malloc(temp[0]*sizeof(int));

  arrB=(double **)malloc(temp[1]*sizeof(int));

  arrC=(double **)malloc(temp[0]*sizeof(int));


 // *** 배열 arrA 를 위한 메모리 할당 행의 수  * 열의 수 만큼 필요

 

  ptr=(double *)malloc(temp[0]*temp[1]*sizeof(double)); // arrA 의 크기

  for(i=0;i<temp[0];++i) {

    arrA[i]=(double *)(ptr+i*temp[1]); //  각열을 초기화

  }

 

 // *** 배열 arrB 를 위한 메모리 할당 행의 수 * 열의 수 만큼 필요

 

  ptr=(double *)malloc(temp[1]*temp[2]*sizeof(double)); // arrB의 크기

  for(i=0;i<temp[1];++i) {

    arrB[i]=(double *)(ptr+i*temp[2]); // 각열을 초기화

  }

 

 // *** 배열 arrC 를 위한 메모리 할당 행의 수 * 열의 수 만큼 필요

 

  ptr=(double *)malloc(temp[0]*temp[2]*sizeof(double)); // arrC 의 크기

  for(i=0;i<temp[0];++i) {

    arrC[i]=(double *)(ptr+i*temp[2]); // 각열을 초기화

  }

 

 //****행렬 A 을 입력하는 부분

 

  for(i=0;i<temp[0];++i) {

    for(j=0;j<temp[1];++j) {

      fscanf(fin,"%lf", &arrA[i][j]);

      printf("%lf ", arrA[i][j]);

    }

    printf("\n");

  }

 

  printf("\n");

 

 //****행렬 B 을 구하는 부분

 

  for(i=0;i<temp[1];++i) {

    for(j=0;j<temp[2];++j) {

      fscanf(fin,"%lf", &arrB[i][j]);

      printf("%lf ", arrB[i][j]);

    }

    printf("\n");

  }

 

  printf("\n");

 

 //printf("*********************************************\n");

  mat_mul(temp, arrA, arrB, arrC);

 //printf("*********************************************\n");

 

 //****행렬 C 을 출력하는 부분

 

  for(i=0;i<temp[0];++i) {

    for(j=0;j<temp[2];++j) {

      printf("%lf ", arrC[i][j]);

    }

    printf("\n");

  }

 

  printf("\n");


  return 0;

}


'c·c++ > c 프로그래밍' 카테고리의 다른 글

행렬의 덧셈, 뺄셈, 곱셈 - 동적할당  (0) 2012.03.25
하노이탑 이해하기  (0) 2012.03.24
10000팩토리얼 구하기  (0) 2012.03.23
bit field로 2진수 출력하기  (0) 2012.03.22
순환호출과 반복문  (0) 2012.03.22