コードを読んでいてどうしてもコードの解読ができなかったので質問します。
以下のソースコードなのですがmain関数内の操作がよくわかりません。
size_data関数はコマンドラインから引き取るファイルのデータサイズを得るものでデータで言えばy=ax+bのyに当たります。least_squarea_method関数は最小二乗法でfsという数列に出力結果を出します。xの定義域はデータサイズの幅ですべて整数値となります。
main関数内でよくわからないことして
1.コマンドライン引数-p number のnumberに当たる部分は何を意味するのか
2.最小二乗法をなぜ0m-1,n-mn-1の間に分割して残りの区間m~n-m-1で平均操作をしているのか
3.コメントアウトで書いた部分の操作の意味
がわかりません。
実行環境:ubuntu20.04
コンパイラ: gcc
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define FILELEN 256 6 7/* get size of input file */ 8int size_data(char *flname) 9{ 10 int i; 11 double x; 12 FILE *fp; 13 14 if( ( fp=fopen(flname, "r") ) == NULL ){ 15 fprintf(stderr, "Cannot opne: %s\n", flname); 16 exit(3); 17 } 18 for( i=0; fscanf(fp, "%le", &x) != EOF ; i++); 19 fclose(fp); 20 21 return (i); 22} 23 24/* least square method */ 25void least_square_method(double f[], double fs[], int start, int end) 26{ 27 int n, i; 28 double sum_i=0, sum_f=0, sum_if=0, sum_ii=0, a, b; 29 30 n = end - start + 1; 31 32 for(i=start; i<=end; i++){ 33 sum_i += i; 34 sum_f += f[i]; 35 sum_if += i*f[i]; 36 sum_ii += (double)i*i; 37 } 38 39 a = (n*sum_if - sum_i*sum_f)/(n*sum_ii - sum_i*sum_i); 40 b = (sum_f*sum_ii - sum_if*sum_i)/ ( n*sum_ii - sum_i*sum_i); 41 for( i=start; i<=end; i++){ 42 fs[i] = i*a + b; 43 } 44} 45 46int main(int argc, char *argv[]) 47{ 48 char flname[FILELEN]; 49 int pts, m, n, i, j; 50 double *y, *ys; 51 FILE *fp; 52 53 if( argc != 4 ){ 54 fprintf(stderr, "number of argument is invalid\n"); 55 return(1); 56 } 57 for( i=1; i<argc; i++){ 58 if( *argv[i] == '-'){ 59 switch( *++argv[i] ){ 60 case 'p': pts = atoi(argv[++i]); 61 if( pts % 2 != 1 || pts == 1){ 62 fprintf(stderr, "Illegal parameter\n"); 63 return(1); 64 } 65 break; 66 default: fprintf(stderr, "Prameter is invalid\n"); 67 return(1); 68 } 69 } else { 70 strcpy(flname, argv[i]); 71 } 72 } 73 74 m = pts / 2; 75 n = size_data(flname); 76 if( n < pts ){ 77 fprintf(stderr, "parameter is invalid\n"); 78 return(1); 79 } 80 y = (double *)malloc( n* sizeof(*y) ); 81 ys = (double *)malloc( n* sizeof(*ys)); 82 if( y == NULL || ys == NULL ){ 83 fprintf(stderr, "Not enough memory\n"); 84 return(2); 85 } 86 87 if( ( fp=fopen(flname, "r") ) == NULL ){ 88 fprintf(stderr, "Cannot open: %s\n", flname); 89 return(3); 90 } 91 for( i=0; i<n; i++){ 92 fscanf(fp, "%le", &y[i]); 93 } 94 fclose(fp); 95 96 if( m == 1 ){ 97 ys[0] = y[0]; 98 ys[n-1] = y[n-1]; 99 }else { 100 least_square_method(y, ys, 0, m-1); 101 least_square_method(y, ys, n-m,n-1); 102 } 103 104 /* この操作がわからない */ 105 for( i=m; i<n-m; i++){ 106 ys[i] = 0; 107 for( j=-m; j<=m; j++){ 108 ys[i] += y[i+j]; 109 } 110 ys[i] /= pts; 111 } 112 113 for(i=0; i<n; i++){ 114 if( printf("%d %le\n", i, ys[i]) == EOF){ 115 fprintf(stderr, "Data full\n"); 116 return(3); 117 } 118 } 119 120 free(y); 121 free(ys); 122 123 return(0); 124} 125 126 127 128コード
あなたの回答
tips
プレビュー