디시인사이드 갤러리

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

갤러리 본문 영역

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

가오.갤로그로 이동합니다. 2010.11.16 19:47:14
조회 204 추천 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/17 - -
231582 C 공부에 C++ 프로그램을 사용하나요? [4] ㅁㅁㅁ(175.206) 11.01.20 163 0
231581 나 지금 2008쓰는데 2010으로 갈아타도 됨? [3] 농농이랑마군갤로그로 이동합니다. 11.01.20 105 0
231580 아우.. VS 2010 은 웰케 묵직해 [3] c0ng(125.180) 11.01.20 148 0
231579 싸이월드, 페이스북 단점이 머라고 생각하나요? [3] 22(211.254) 11.01.20 780 0
231578 리스트 구현에관해서 질문하나만 [12] 으엌구(115.126) 11.01.20 77 0
231577 dev c에서 변수공부하고 있는데 이거 왜 안되는건가요? [7] dmgjgk(59.21) 11.01.20 100 0
231576 횽든 노트북 중고 쓸만한 모델없음? ㅇㅇㅇㄹㄹ(220.89) 11.01.20 47 0
231575 sata확실히 빠르네 [3] 이모군(1.225) 11.01.20 75 0
231573 사실 인생이 프로그래밍이야. [3] 하하하(58.180) 11.01.20 137 0
231569 (meta) equivalence class [1] 땡칠도사갤로그로 이동합니다. 11.01.20 92 0
231568 구형 939보드에 sata하드 장착하느라 돌아가실뻔했네 이모군(1.225) 11.01.20 68 0
231567 Netbeans 좋은데 느리네요. [2] 우분투짱(174.21) 11.01.20 85 0
231566 C++ 하다가 C# 해본 횽아들아 [4] 허허벌판갤로그로 이동합니다. 11.01.20 154 0
231564 근데 프로그래밍을 취미로 조금씩 하려는데 질문 [5] ㄱㄴㄷㄹ(125.135) 11.01.20 115 0
231561 비쥬얼스튜디오 6 이랑 2010이랑 많이 다른가요? [4] 뉴뉴뉴(59.21) 11.01.20 155 0
231560 니들 정신상태가 그러니 개발자의 미래가 없는거다 [9] ㅇㅇ(113.59) 11.01.20 161 0
231559 프로그래머 수요가 공급보다 많나요??? [12] 컴돌이(58.77) 11.01.20 345 0
231558 프로그램 제작 의뢰! [5] 뽀잉(113.59) 11.01.20 145 0
231557 용어설명좀해수제요 [1] aaa(163.152) 11.01.20 49 0
231556 Netbeans + Apache Tomcat6 좋네요. [2] 우분투짱(174.21) 11.01.20 112 0
231555 svn 에서 특정 파일만 커밋하는 방법 아는사람~ [2] ㅇㅇ(125.132) 11.01.20 267 0
231554 내가 던파를 기반으로 겜을 만들건데 [1] 하하하(58.180) 11.01.20 91 0
231552 개발자들 ZOT 같은 특징들 중 하나 [4] 에이치(115.139) 11.01.20 176 0
231551 플래시 질문좀해도 되나요 ㅠㅠ [2] 뉴브늅(61.252) 11.01.20 66 0
231550 님들 똑똑하면 아프리카 정도 해킹가능함??? [4] 으엌(113.59) 11.01.20 225 0
231548 경악 14살에.. [1] 123(119.195) 11.01.20 170 0
231545 여러개의 소스 파일을 한번에 뛰워 한꺼번에 보고싶다. [4] 하하하(58.180) 11.01.20 95 0
231544 동종업계 이직금지를 금지하는 좌파 미국 법무부 왁스맛치즈갤로그로 이동합니다. 11.01.20 121 0
231543 제가 프로그래머가 꿈인데 [4] 비버니(124.51) 11.01.20 142 0
231542 여자가 프로그래밍쪽으로 나가는건 안좋나요?? [4] 잉잉(175.117) 11.01.20 182 0
231541 일단 IT로 성공할려면 학벌 or 외모임. [7] 하하하(58.180) 11.01.20 238 0
231540 윈도우즈 서버 써본 횽아?? [4] 허허벌판갤로그로 이동합니다. 11.01.20 81 0
231539 IT에서 성공하는데 가장 중요한게 머라고 생각함? [19] 22(211.254) 11.01.20 249 0
231538 수 배열을 입력받을때 간단한방법 없을까요? [4] 12324갤로그로 이동합니다. 11.01.20 105 0
231537 22 녀석은 한번 더 봅니다. [8] 철부지닭(112.216) 11.01.20 99 0
231536 개발자의 동종간 이직을 법으로 금지했다면 [3] 하하하(58.180) 11.01.20 236 0
231535 "전 잘 몰라요..동생 지금 헬스 갔어요~" 아 슈ㅣ발 이 뭐병... [2] 철부지닭(112.216) 11.01.20 135 0
231534 프로그래밍 테크트리에 관해서 우분투짱(174.21) 11.01.20 134 0
231533 밑에꺼 내가 조흥거줄려햇는데 여기만오지마 댓글써줘 [1] 보안은(124.49) 11.01.20 84 0
231532 보안 갤은 안생기나 해킹이나 ......... 안생기겟지 이런 보안은(124.49) 11.01.20 94 0
231531 일베에 프로그래밍 과제 질문 누가 장난 친거죠? [7] 12324갤로그로 이동합니다. 11.01.20 114 0
231529 프로그래머도 노조를 만들어야 한다. [9] 데니스리치짱(112.221) 11.01.20 241 0
231528 븅진드라, 허니콤 준비해라. 허니콤 준비해라. [5] 하하하(58.180) 11.01.20 140 0
231527 SNS? ㅋㅋㅋ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [3] 하하하(58.180) 11.01.20 106 0
231526 프로그래머가 야근하는 이유? 뻔하지!! [4] 하하하(58.180) 11.01.20 229 0
231524 왜 컴공신입꼬꼬마생퀴들은 다 c를 선행하려고하는걸까 [6] gfd(210.178) 11.01.20 278 0
231523 "PHP vs Java Servlet" on "DB 연결" [17] 우분투짱(174.21) 11.01.20 201 0
231522 질문 하나만 할게요. [11] 유대인갤로그로 이동합니다. 11.01.20 110 0
231521 다이렉트sdk 9버전깔고 d3d8.lib가 없어서 안되는건 뭥미... [3] *^^(221.162) 11.01.20 104 0
231520 형들.. 소셜 네트워크에서 에두와르두 형제말이야. [31] 22(211.254) 11.01.20 223 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2