디시인사이드 갤러리

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

갤러리 본문 영역

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

가오.갤로그로 이동합니다. 2010.11.16 19:47:14
조회 203 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 힘들게 성공한 만큼 절대 논란 안 만들 것 같은 스타는? 운영자 24/06/10 - -
230152 아시발정품 풋사과1갤로그로 이동합니다. 11.01.11 59 0
230151 지잡나와서 대학원온 좋은데 갈수잇음? [5] 555(119.203) 11.01.11 147 0
230149 내가 괜찮은 야동 토런트 사이트 알려드림 [8] 늅늅늅(118.47) 11.01.11 2238 1
230148 형들 질문있어 location.href [22] SGee갤로그로 이동합니다. 11.01.11 155 0
230147 컴공은 그나마 대학교 덜 따지는 듯 [3] 좍이(222.101) 11.01.10 247 0
230145 구글 핑때리면 몇 나오나요? 123ms 나오는데 인터넷이 병신? ㅠㅠ [4] 좍이(222.101) 11.01.10 86 0
230141 유저검색이 대세인가? 옛날 지자스인가 먼가 아이디 바깐나? ㅁㄴㅇㄹ(182.208) 11.01.10 38 0
230140 OPEN API 네이버꺼 보니까 [3] 할리의본링갤로그로 이동합니다. 11.01.10 132 0
230139 플래시로 영상 하나 만들어 보려고 하는데 스토리 좀 추천해 줘욤 [4] 미클갤로그로 이동합니다. 11.01.10 80 0
230138 엑스키퍼 정복하는 방법 선열갤로그로 이동합니다. 11.01.10 70 0
230137 이게 무슨 분얀지는 모르겠는데 공부하고싶은데 [6] 할리의본링갤로그로 이동합니다. 11.01.10 94 0
230136 아프리카 tv이런거는 프로그래머가 생각하고만든거야아니면 [3] 555(119.203) 11.01.10 121 0
230135 컴공가기전에 c공부하는게나아 아니면 java공부하는게 좋음? [5] 555(119.203) 11.01.10 223 0
230134 엑셀질문 주기적으로 데이타 선택하기 쯔밤갤로그로 이동합니다. 11.01.10 42 0
230133 지잡대 컴공나오면 헬임? [9] 555(119.203) 11.01.10 320 0
230132 저기 형들 암호프로그램좀 만들수 있어? 암호와해독을 자동으로 해주는프로그 [23] 절대반지(119.17) 11.01.10 193 0
230131 JAVA 책 추천좀 해주세요. [4] ㄷㄷ(114.200) 11.01.10 225 0
230130 피씨렛3.5 사용하는데요 친구한테실험해도 뜨질않습니다 [2] 또치·갤로그로 이동합니다. 11.01.10 899 0
230128 혹시 프갤러중에 44473 포트 아는사람있음? [9] d(211.205) 11.01.10 104 0
230127 ㅠ.ㅠ 횽아들 축하해줘 드디어 네이트온 설치했쪄요 [3] 이바보갤로그로 이동합니다. 11.01.10 142 0
230126 ↓ 님 이런식으로 안보이는 사람 자꾸 찾다간 [2] 왁스향고추(110.15) 11.01.10 83 0
230122 투명인간이_된_기분.png [2] 막창과치즈(110.15) 11.01.10 236 0
230121 C로 짠게 OBJ-C에서 다돌아간다는게 레알입니까 [4] --(119.71) 11.01.10 165 0
230119 fuck.exe 라는 프로세서 몬지아세요? 검색해도안나오는데 -0- [3] 두사늬(210.107) 11.01.10 257 0
230118 진로?? [1] ㅇㅇ(121.165) 11.01.10 148 0
230117 B-TEEN의 이미지는 이런게 아닐까? [3] 속결자갤로그로 이동합니다. 11.01.10 161 0
230116 램쳐먹는 실험 할것 [6] [성대아싸]갤로그로 이동합니다. 11.01.10 199 0
230113 컴터 질렀어요.... [9] [성대아싸]갤로그로 이동합니다. 11.01.10 203 0
230112 프로그래밍 처음시작하는데요 [2] 최궁금갤로그로 이동합니다. 11.01.10 116 0
230111 자료구조 수업의 중요성 [12] ㅇㅇ(121.137) 11.01.10 363 0
230109 또 배종옥 나온다... [3] 분당살람갤로그로 이동합니다. 11.01.10 91 0
230108 두시간 공부한 사람은 네시간 공부한 사람을? [2] 갤러리갤로그로 이동합니다. 11.01.10 143 0
230107 오늘 하루 정리및 남은 하루의 계획 [3] 꿀레갤로그로 이동합니다. 11.01.10 75 0
230106 횽들 자바스크립트 조언 좀... [17] jsp동생(222.112) 11.01.10 199 0
230105 싸게 테섭돌리려고 투반을 생각중인데 ㅁㄴㅊ(59.27) 11.01.10 80 0
230104 컴퓨터 쪽으로 관심이 있는데...... [5] John lemon갤로그로 이동합니다. 11.01.10 169 0
230103 영어 재밌다. [7] ㅁㄴㅇㄹ(121.130) 11.01.10 136 0
230102 XP 커스터마이징 관련 글 자삭했습니다. [2] 우분투짱(174.21) 11.01.10 85 0
230101 북한 보위부 전산망 해킹해봐 [1] 속결자갤로그로 이동합니다. 11.01.10 181 0
230100 ip주소 질문 좀 해도 돼? [7] 이모군(211.40) 11.01.10 155 0
230099 순수 해킹의 끝은 구속. ㅜㅜ [8] BTTTS!갤로그로 이동합니다. 11.01.10 337 0
230098 해킹학원 알려달라는 시방새들아 [1] 왁스맛치즈갤로그로 이동합니다. 11.01.10 258 0
230097 워매 인터넷 속도가 OS 영향을 이렇게 많이받는줄 몰랐네 [6] BTTTS!갤로그로 이동합니다. 11.01.10 147 0
230096 C++책 추천좀 부탁드립니다.. [1] team50(183.104) 11.01.10 129 0
230095 DNS서버의 IP주소가 바뀔때도 있나요? [3] 저격곰팡이갤로그로 이동합니다. 11.01.10 138 0
230094 프갤에 왜 윈도설치 글이 보이지 [4] 왁스맛치즈갤로그로 이동합니다. 11.01.10 99 0
230091 아 새로깔았으니까 이거설치해야지, 이것도, 이것도,,, [1] BTTTS!갤로그로 이동합니다. 11.01.10 64 0
230090 안녕 6번째로 만나는 윈도우 7! [2] BTTTS!갤로그로 이동합니다. 11.01.10 135 0
230088 5시 설치 시작,. 5시 47분 설치 완료,. [1] BTTTS!갤로그로 이동합니다. 11.01.10 73 0
230087 잡스 개새끼 해봐 [3] 유리한갤로그로 이동합니다. 11.01.10 186 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2