디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

FILE *fp 오류 나는거 소스입니다.(reg.txt파일 첨부 포함)

가오.갤로그로 이동합니다. 2010.11.16 19:47:14
조회 209 추천 0 댓글 14
														

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

/*
이 프로그램은 전산통계 과목에 사용된 프로그램으로
주어진 행렬의 HalfMatrix를 구 하고
HalfMatrix의 역행렬인 B행렬을 구하는 프로그램입니다.

목적 : 전치행렬 및 행렬의 곱을 구하는 프로그램.

*/

int indx(int i, int j);

void main() {
 int
  n, p, //det, /* for size of matrix */
  ij, i, j, k, fp,/* index */
  df, dfn, dfp;
 double
  *x, *z, *h, //*b, /* for matrix */
  sum,  //각각의 합과 역행렬의 determinant
  SSR=0, SSE=0, SST=0,
  MSE=0, MSR=0, RMSE=0,
  RR=0, F=0, DPM=0;
 printf("자료인 X행렬을 통해 Z행렬을 찾아내고\\nZ행렬의 Half Maxrix를 이용해 ANOVA Table을 구하는 프로그램입니다.\\n\\n"); 
 printf("먼저, X행렬을 출력하겠습니다.\\n\\n  =X Matrix=\\n");


 FILE *fp;
 /* 입력 파일 정하기 */
 //현재 소스 폴더에 있는 파일을 읽을때 그냥 " "안에만 넣으면 읽히는것으로 알고 있습니다.

 

 if((fp=fopen("C:\\\\reg.txt","r"))==NULL){
  printf("Error Opening file \\n");
  exit(1);
 }

 /* 행의 개수와 열의 개수 읽기 */
 fscanf(fp,"%d %d",&n,&p);

 /* 메모리 할당 */
 x=(double *) malloc(n*(p+1)*sizeof(double));

 /* 자료 읽기 */
 for (i=0; i<n; i++) {    
  for (j=0; j<(p+1); j++) {//X행렬의 가장 앞에 1이 오므로 열이 하나 늘어나게 되어 p+1까지 계산합니다.
   if(j==0) x[i*(p+1)+j]=1; //X행렬의 가장 앞은 1이 저장되도록 했습니다.
   else{
   fscanf(fp,"%lf",&x[i*(p+1)+j]);
  }}
 }


 //Matrix X의 출력
 for (i=0; i<n; i++) {
  printf("│");
  for (j=0; j<(p+1); j++) {
   printf("%7.2f ",x[(p+1)*i+j]);
  }
  printf("│\\n");
 }
 printf("\\n다음, X\'X행렬인 Z를 출력하겠습니다.\\n\\n  =Z Matrix=\\n");
 //X\'X인 Z행렬의 저장 및 출력.

  z=(double *) malloc((p+1)*(p+2)/2*sizeof(double)); //행렬의 크기가 늘어나므로 동적할당에도 용량을 늘렸습니다.
 for(i=0; i<p+1; i++){
  for(j=0; j<=i;j++){
   ij=indx(i,j);//상삼각행렬이 되도록 ij값을 indx를 이용하여 적절하게 바꿔줍니다.
   z[ij]=0; //행렬의 초기화
   for (k=0; k<n; k++) z[ij] += x[k*(p+1)+i]*x[k*(p+1)+j]; //X\'X 의 계산
  }
 }
 //z출력
 for (i=0; i<p+1; i++) {
  printf("│");
  for (j=0; j<p+1; j++) {
   printf("%9.2f ",z[indx(i,j)]);
  }
  printf("│");
  printf("\\n");
 }

        
 //Half Metrix//
 
 printf("\\n여기서 Z의 Half Matrix인 H행렬을 구해 보겠습니다.\\n");
  printf("  =H Matrix=\\n");
  h=(double *) malloc((p+1)*(p+2)/2*sizeof(double));
 for (i=0; i<n; i++){
  for(j=0; j<p+1; j++){
   if (i==j){  //i와 j가 같을 경우입니다.
     sum=0;  
     //sigma를 계산할때 사용하기 위한 변수입니다. 실행될때마다 초기화합니다.
     for(k=0; k<i; k++){ // sigma 계산
       sum += h[(indx(k,i))]*h[(indx(k,i))];  
       //uppertriangle 이므로 indx를 이용하여 불러옵니다
     }     
    h[(indx(i,j))]=sqrt(z[indx(i,j)]-sum);
    //uppertriangle이므로 h의 저장을 이렇게 합니다.
    //a메트릭스는 triangle이 아니므로 일반적인 방법으로 불러옵니다.  
   }
   else if(i<j) {  //j가 i보다 큰 경우입니다.
     sum=0;
     //sigma를 계산할때 사용하기 위한 변수입니다. 실행될때마다 초기화합니다.
     for(k=0; k<i; k++){      
       sum += h[(indx(k,i))]*h[(indx(k,j))];
     }
     //h(ii)값이 0에 가까우면 오류 메시지 출력
     if(h[(indx(i,i))] > -0.00001 && h[(indx(i,i))] < 0.00001){
      printf("\\nh(ii)값이 너무 작아 진행할 수 없습니다.\\n프로그램을 종료합니다.\\n\\n");
      exit(1);
     }
     else h[(indx(i,j))]=(z[indx(i,j)]-sum)/h[(indx(i,i))];
   }
   //이 부분에 i가 j보다 큰 경우를 적어주어야 하는데 h메트릭스의 저장공간 절약을 위해 0을 저장하지 않으므로
   //이 경우에는 그냥 건너 뛰도록 아무문장도 넣지 않았습니다. 즉 j>=i일때만 h에 저장하도록 했습니다.
  }
 }
 //메트릭스의 출력.
 for (i=0; i<p+1; i++) {
  printf("│");
  for (j=0; j<p+1; j++) {
    if(j>=i) printf("%9.4f ",h[(indx(i,j))]);//j가i보다 같거나 더 클 경우만 출력되도록 했습니다.
               //이렇게 하지 않으면 symmatric한 모습으로 출력되겠지요.
    else printf("%9.4f ",0);     //i가 더 클경우에는 0이 출력되도록 했습니다.
  }
  printf("│\\n");
 } 
/*  B메트릭스를 구하는 소스는 숨겨놓았습니다.

  printf("\\n그럼 H행렬의 역행렬인 B행렬을 구해 보겠습니다.\\n\\n");
  printf("  =B Matrix=\\n");
//B Matrix
  b=(double *) malloc((p+1)*(p+2)/2*sizeof(double));
 det=1;
 for(i=0;i<p;i++){
  det = h[indx(i,i)]*det;
 }
 if(det > -0.00001 && det < 0.00001){
  printf("\\n행렬식의 크기가 너무작아 진행할 수 없습니다.\\n프로그램을 종료합니다.\\n\\n");
  exit(1);
 }//행렬식의 크기가 0에 가까우면 실행되지 않도록 했습니다.
 for(i=0; i<p+1; i++){
  for(j=0; j<p+1; j++){
   if(i==j){ //i와 j가 같은 경우입니다.
    b[(indx(i,j))] = 1/h[(indx(i,j))];
    //b와 h행렬이 모두 Uppertriangle이므로 indx문을 사용해서 입력
   }
   else if(i<j){  //j가 i보다 큰 경우입니다.
    sum=0;
     for(k=i; k<j; k++){  //sigma의 계산
      sum += b[(indx(i,k))]*h[(indx(k,j))];
     }
    if(h[(indx(j,j))] > -0.00001 && h[(indx(j,j))] < 0.00001){
     printf("\\nh(jj)값이 너무 작아 진행할 수 없습니다.\\n프로그램을 종료합니다.\\n\\n");
     exit(1);
    }//h(jj)가 0의 값에 가까우면 오류가 나도록 설정하였습니다.
    else b[(indx(i,j))] = -sum/h[(indx(j,j))];
    //b행렬 구하는 식
   }
   //이곳에 i가j보다 큰 경우를 적어주어야 하는데 b메트릭스의 저장공간의 절약을 위해 0을 저장하지 않으므로
   //i가 j보다 큰 경우엔 그냥 건너뛰도록 아무 문장도 넣지 않았습니다.
  }
 }

 for (i=0; i<p+1; i++) {
  printf("│");
  for (j=0; j<p+1; j++) {
    if(j>=i) printf("%9.4f ",b[(indx(i,j))]);
    //j가i보다 같거나 더 클 경우만 출력되도록 했습니다
    else printf("%9.4f ",0);
  }
  printf("│\\n");
 }
*/

 for(i=1 ; i<p ; i++){ //SSR입니다. 제일 위의 행과 아래 행을 제외하고 제곱하여 구합니다.
  SSR += h[indx(i,p)]*h[indx(i,p)];
 }
 for(k=0 ; k<n ; k++){ //Dependent Mean 을 구하기 위해서 사용한 반복문입니다.
  DPM += x[k*(p+1)+p];
 }
 dfp = p-1;
 dfn = n-1;
 df = dfn-dfp; // 각각의 자유도들 입니다.
 SSE = h[indx(p,p)]*h[indx(p,p)]; //SSE는 h행렬의 마지막줄 마지막열의 곱으로 나타납니다.
 SST = SSR+SSE; // SST는 SSR+SSE로 나타 낼 수 있습니다.
 RR = SSR/SST; //R-Square입니다.
 MSE = SSE/df; //MSE는 SSE를 오차의 자유도로 나눈값입니다.
 MSR = SSR/dfp; //MSR은 SSR을 변수의 자유도로 나눈 값입니다.
 F =  MSR/MSE; //F값은 MSR/MSE로 나타냅니다.
 RMSE = sqrt(MSE); //Root MSE입니다. MSE값에 제곱근을 한 값입니다.
 DPM = DPM/n; //위의 DPM값을 n으로 나누어서 구한 y값의 평균입니다.
 printf("\\nANOVA TABLE을 출력하겠습니다.");
 
 //아노바 테이블의 출력입니다.
 
 printf("\\n\\n              Analysis of Variance(ANOVA TABLE)\\n\\n");
 printf("┌────────┬─┬───────┬──────┬────┐\\n");
 printf("│Source          │DF│Sum of Squares│ Mean Square│ F-Value│\\n");
 printf("├────────┼─┼───────┼──────┼────┤\\n");
 printf("│Model           │%2d│%14.0f│%12.5f│%8.2f│\\n",dfp,SSR,MSR,F);
 printf("│Error           │%2d│%14.5f│%12.5f│        │\\n",df,SSE,MSE);
 printf("│Corrected Total │%2d│%14.0f│            │        │\\n",dfn,SST);
 printf("├────────┼─┴───┬───┴──────┴────┘\\n");
 printf("│Root MSE        │%10.5f│\\n│R-Square        │%10.4f│\\n",RMSE,RR);
 printf("│Dependent Mean  │%10.5f│\\n",DPM);
 printf("└────────┴─────┘\\n");
 printf("\\n이상으로 프로그램을 종료합니다.\\n");

}

int indx(int i, int j) //upper triangle로 저장되도록 약간 변경 하였습니다.
{
 if (j>=i) return (j*(j+1)/2+i);
 else return (i*(i+1)/2+j);
}

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45306 65
2870687 애플 디벨로퍼 아카데미? 프갤러(118.235) 15:52 4 0
2870684 하 씨발 1차 납품했는데 버그 원인을 못찾겠어 [5] ㅆㅇㅆ(124.216) 15:14 30 0
2870682 정좌불능증 [3] 재현갤로그로 이동합니다. 14:53 13 0
2870680 덥다 [3] 루도그담당(211.235) 14:31 24 0
2870675 제미니 글쓰기 좋다. 수백 페이지 입력 가능 [2] 루비갤로그로 이동합니다. 12:58 26 0
2870673 [대한민국] 모스탄 대사 그라운드 씨에 출현 예정- [1] 프갤러(121.172) 12:37 20 0
2870672 코드 가장 잘 짜는 AI 뭐냐? [13] 아스카영원히사랑해갤로그로 이동합니다. 12:18 96 0
2870671 종종 끌올되는 픎 자컨팀 빼앗겼다는 날조선동 ㅇㅇ(110.70) 12:01 34 0
2870670 지피티 씨발 존나 답답하네 [1] 아스카영원히사랑해갤로그로 이동합니다. 11:38 56 0
2870669 한국에 과학수사 포렌식 이런직업이 많은이유는 뒷통수한방(1.213) 11:14 48 0
2870668 저커버거 빌게이츠 머스크 이런애들 좇센에서태어났으면 뒷통수한방(1.213) 11:02 46 1
2870667 헬마님 질문이 있습니다 [7] 아스카영원히사랑해갤로그로 이동합니다. 09:59 64 0
2870666 짱깨폭염 짱깨들 전부 좇센으로 물들었네 뒷통수한방(1.213) 09:55 22 0
2870664 자러 간다~ ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 09:29 13 0
2870662 흑흑.. 내컴이 내 선풍기 가져갔다.. ㅇㅅㅇ [5] 헤르 미온느갤로그로 이동합니다. 09:21 38 0
2870658 게임엔진개발자 맥북 [7] 미니애폴리스갤로그로 이동합니다. 07:30 68 0
2870655 완결) 러스트 담론을 해체하다 루비갤로그로 이동합니다. 06:36 43 1
2870653 나팔 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 04:24 25 0
2870652 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 03:44 27 0
2870651 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 03:41 29 0
2870649 백신맞고 몸 망가진 2찍들은 국짐당 원망해야지 [8] 야옹아저씨갤로그로 이동합니다. 02:42 144 5
2870648 1일 1딸 멈추라고 하시면 멈추겠습니다. [3] 도리스아(121.139) 02:32 46 0
2870647 나는 기후위기를 걱정한 적이 없었는데 [9] 아스카영원히사랑해갤로그로 이동합니다. 01:34 75 0
2870646 MCP 에이전트로 코딩하면서 나는 프로그래밍 책 읽고 있는데 ㅆㅇㅆ(124.216) 01:24 42 0
2870644 그러고보니 예전 프갤러들 싹 사라졌네 [4] 박민준갤로그로 이동합니다. 00:48 122 1
2870643 울산에서 일하는 31살 공장충인데 지금 입문 어떻게 생각해 [6] ㅇㅇ(118.235) 00:25 117 0
2870642 바탕화면에 공룡 키워 보세요.... 프갤러(118.41) 07.08 88 2
2870641 프갤하는거 들켰다 프갤러(220.65) 07.08 39 0
2870639 성추행해서 미안해 너무 아파서 그랬어... 넥도리아(223.38) 07.08 37 0
2870638 고1 프로그래밍에 손을 대보려합니다 [9] 프갤러(218.239) 07.08 114 0
2870636 가끔 나 따라 다니는 유동 저거 냥덩이 아닐까 한다 [1] ㅆㅇㅆ(124.216) 07.08 55 0
2870635 조루디 ㅆㅇㅆ 잘어울려 ㅇㅇ(211.235) 07.08 44 3
2870633 R 뭐 배우는데 OLD R베이스 문법? [2] ㅆㅇㅆ(124.216) 07.08 54 0
2870632 결혼하면 프갤러들 축의금 줘 [4] 조루디(110.35) 07.08 63 0
2870631 R은 대학원 갈 거 아니면 뭐 쓸 일 거의 없을텐데 ㅆㅇㅆ(124.216) 07.08 33 0
2870630 제발 한숨쉬지마세요 노처녀드라 [1] 조루디(110.35) 07.08 61 0
2870629 문관데 제발 도와주세요 제발 제발제발 [15] 프갤러(118.47) 07.08 99 0
2870627 주식대박났다 [2] 조루디(110.35) 07.08 95 0
2870624 면접보면서 당황했던 경험 ㅇㅇ(112.169) 07.08 33 0
2870622 17일 도쿄 여행인데 아스카영원히사랑해갤로그로 이동합니다. 07.08 56 0
2870620 PC-6001 페이지용 Contiki 발명도둑잡기(118.216) 07.08 26 0
2870618 국비들으면 쉽게 취업하는시대일때 국비 짤린거면 얼마나 병신새끼인거임?? 뒷.통수한방(1.213) 07.08 93 1
2870617 좆같은 기술스택을 쓰고있다 <- 탈출해야함 프갤러(59.14) 07.08 49 0
2870615 어우 일나가기 실타..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 07.08 21 0
2870613 러스트 비판서 거의 다 썼다. 루비갤로그로 이동합니다. 07.08 34 0
2870610 냥덩이는 그냥 귀척하는 윤서인이라봐야 [2] 류류(115.136) 07.08 51 0
2870609 윤석열 무능한건 맞지않나 ㅇㅅㅇ 류류(115.136) 07.08 28 0
2870603 별찍기를 무시하지마라 [1] 배구공(119.202) 07.08 38 0
2870597 방화벽 지금 2주째 안 뚫어주는데 [12] 아스카영원히사랑해갤로그로 이동합니다. 07.08 113 0
뉴스 이시영 "전 남편 동의없이 시험관"…둘째 임신 발표에 '갑론을박' 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2