디시인사이드 갤러리

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

갤러리 본문 영역

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

가오.갤로그로 이동합니다. 2010.11.16 19:47:14
조회 208 추천 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 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
347647 카메라에 붙였던 보안스티커가 잘못뜯어졌다.. [1] ㅋㄱ(183.96) 13.03.01 86 0
347646 비쥬얼 스튜디오에서 새항목 추가가 안뜸 [1] 93년생미필(1.242) 13.03.01 110 0
347643 C++ 로 OOP구조 잘살려서 게임만들어야하는대 책추천좀 (조공) 질문의계곡(211.237) 13.03.01 388 0
347642 보통웹사이트만들면 어디서 홍보함? [4] 2re(175.215) 13.03.01 119 0
347640 회사에서 아무리 네트워크 막아도 USB 와이파이 꽂아서 잘만 쓰더라 [1] 멍청닭(182.211) 13.03.01 137 0
347639 니들이 아무리 학벌로 고급 노예네 저급 노예네 떠들어봐야 [2] 멍청닭(182.211) 13.03.01 209 2
347637 [수정]프갤러들의 예리한 눈으로 새 로고가 어느게 좋을지 좀 봐줘 [2] 서버짱짱맨(121.181) 13.03.01 129 0
347635 회사 떄쳐고 싶다 개 시부랄 [2] 돌대갈(116.33) 13.03.01 176 0
347633 혼자 어느정도를 해야 초급 프로그래머임? [6] 오른쪽아래(123.109) 13.03.01 286 0
347631 어차피 대기업 노예인건 똑같건만 ㅋㅋ [1] DART(39.7) 13.03.01 260 0
347630 형님들 회사 첫날에 어디로 가야해여? [8] ㅁㄴㅇㄹ(211.117) 13.03.01 192 1
347629 cafe24같은데서 호스팅 받고있는데 늅늅이(218.153) 13.03.01 52 0
347628 프로그래밍에 영어 실력 당근 중요하지 않나..? 야요이갤로그로 이동합니다. 13.03.01 74 0
347627 존나 프갤러 병신들 ㅋㅋ 회사 다니기는 하냐? 전부 걍 백수 오타쿠아님? [2] 연대컴공신입(218.37) 13.03.01 152 0
347626 형들 이번 연대컴공 붙은 학생인데요; C언어 미리 공부하고 있는데 질문좀 [20] 연대컴공신입(218.37) 13.03.01 340 0
347625 실북갤 기준이 글 리젠인가 ?? 규식이(218.153) 13.03.01 28 0
347624 英 정보국 “3·1운동 젊은 여학생들이 적극 가담했다” 보고서 공개 에어로홍갤로그로 이동합니다. 13.03.01 67 0
347623 형들 안드로이드 할려면 [2] 아니아니아니(203.255) 13.03.01 105 0
347622 안드로이드가 오픈소스인대 죶초중고복붙포터 새끼들은 뭐냐 ㅇㅇ(175.112) 13.03.01 64 0
347619 주갤난제 저거 개소리고 내가 정확하게 집어준다 프로그래밍 갤러들아 [3] ㅋㅋ(175.211) 13.03.01 125 0
347618 현시간 주갤의 난제.jpg [6] 개마무사갤로그로 이동합니다. 13.03.01 244 0
347616 내가짜논코드를 이해못하는경우도잇음? [3] 1ㅈ(175.215) 13.03.01 141 0
347615 앱 개발자는 이제 넘쳐나지 않냐 ㅁㄴㅇㄹ(121.134) 13.03.01 133 1
347613 좇도아닌고딩들 어처구니없다 증말 [9] 삐쭊이(211.218) 13.03.01 268 2
347610 웹은 노가다 아님? [3] 하하하(1.231) 13.02.28 164 0
347608 css를 사용자가 직접 속성을 정의할 수도있음? [7] 1ㅈ(175.215) 13.02.28 141 0
347605 야 C#이랑 [6] 코웅갤로그로 이동합니다. 13.02.28 189 0
347604 서울에서 이정도면 잘사는거임? [10] 푸푸푸(210.121) 13.02.28 284 0
347603 대학4년인데 3학년까지 놀고먹었다 시마스(119.70) 13.02.28 99 0
347601 밑에 물리엔진에 이어, 이족보행 ㅋㅋㅋ 규식이(218.153) 13.02.28 102 0
347600 물리 엔진으로 대포동 미사일 만듬 멍청닭(182.211) 13.02.28 102 0
347599 물리엔진에게 유전자 알고리즘을 적용한다면?? [7] 멍청닭(182.211) 13.02.28 265 1
347598 모델추출하는거 넘 개같음.. 도레기(221.138) 13.02.28 47 0
347597 자바랑 씨씨쁠쁠 [1] 말룡갤로그로 이동합니다. 13.02.28 116 0
347596 넷빈 뭐임? 자바꺼 넷빈?(164.125) 13.02.28 66 0
347593 폰 노이만이 내장 바식 특허 냈으면 얼마나 벌었을까 티모티모(211.112) 13.02.28 130 0
347591 mfc c# [5] 0000(211.37) 13.02.28 134 0
347590 3d게임 포폴 만들려구하는데 [1] 도레기(221.138) 13.02.28 116 0
347587 추억은 방울방울 d+(119.69) 13.02.28 66 0
347586 프갤_공식_음악은_이것이다.jpg 나리링갤로그로 이동합니다. 13.02.28 157 0
347585 C,C++을 넘기고 C#을 할때 필히 알아야할것 [3] (168.126) 13.02.28 225 0
347584 우와~~ 내일부터 연휴다~~ [1] 멍청닭(182.211) 13.02.28 73 0
347583 내가 이번에 구입하려는 키보드(뒤 조심) 멍청닭(182.211) 13.02.28 141 0
347582 졸린 프겔러들을 위한 여경의 귀요미 송 [1] 멍청닭(182.211) 13.02.28 105 0
347581 노트북 추천해주세요 [3] (211.201) 13.02.28 128 0
347580 VB, JAVASCRIPT 책 좋은거 아는갤러있나여 [1] 마루■■갤로그로 이동합니다. 13.02.28 66 0
347579 it특기병같은경우 갈려면힘든가? 그래(211.237) 13.02.28 53 0
347578 JSP & Mysql 여러분들의 따뜻한 관심이 필요한 때입니다. 으악 카이로스™갤로그로 이동합니다. 13.02.28 64 0
347577 디버그랑 릴리즈 라이브러리 차이점이 뭐냐 [2] ㅁㄴㅇㄹ(203.255) 13.02.28 43 0
347576 Visual Studio Express 2012 for WEB 툴 어떰 [1] 1ㅈ(175.215) 13.02.28 85 0
뉴스 고건한, 박지훈·배인혁과 한둥지…YY엔터테인먼트와 전속계약 디시트렌드 07.05
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2