int main() { FILE *in = fopen("task.in", "r"); FILE *out = fopen("task.out", "w"); int length = intScan(in); int array[length]; arrayScan(in, array, length); arrayAbs(array, length); fclose(in); arrayPrint(out, array, length); fclose(out); return 0; }
int resistmean (float *in, int npix, float sigrej, float *mean, float *sigmean, float *min, float *max) { /* Arguments: ** in i: pointer to array of input values ** npix i: size of the input array ** sigrej i: the sigma level for pixel rejection ** mean o: mean value of unrejected pixels ** sigmean o: standard deviation of unrejected pixels ** (NOT the uncertainty or sigma of the mean) ** min o: minimum of input values ** max o: maximum of input values */ /* Local variables */ int i, j; /* loop indexes */ float median; /* median value of input array */ float *absdev; /* absolute deviation array */ float medabsdev; /* median of the absdev array */ float *tempdata; /* array of good pixel values */ float *tempdata2; /* array of good pixel values */ double sum; /* sum of pixel values */ float cutoff; /* value limitation */ int npix1, npix2; /* number of pixels in temp arrays */ /* Function definitions */ float findRMedian (float *, int ); /* compute median of array */ float findMean(float *, int ); /* compute mean of array */ float findSigma(float *, int , float *); /* compute stddev of array */ void arrayDiff(float *, float *, float , int ); /* subtract median */ void arrayAbs(float *,int); /* compute absolute value of array */ void wheregood(float *, float , int * ); /* flag outliers in array */ /* Initialize the counters and results */ npix1 = npix; *mean = 0.; *sigmean = 0.; *min = 0; *max = 0; median = 0.; medabsdev = 0.; cutoff = 0.; /* allocate temp arrays to store and manipulate the input array */ if (npix != 0) { /* an array to store a copy of the data*/ tempdata = (float *) calloc(npix, sizeof(float)); if (tempdata == NULL) { sprintf (MsgText, "Memory allocation failure in resistmean"); trlmessage (MsgText); return (1); } /* and an array to store absolute deviation */ absdev = (float *) calloc(npix, sizeof(float)); if (absdev == NULL) { sprintf (MsgText, "Memory allocation failure in resistmean"); trlmessage (MsgText); return (1); } } else { sprintf (MsgText, "Zero size array passed to resistmean"); trlerror (MsgText); return (1); } /* Copy the input array, computing the initial sum, min, max */ sum = 0.; *min = tempdata[0]; *max = tempdata[0]; for (i=0; i<npix1; i++) { tempdata[i] = in[i]; sum += tempdata[i]; if (tempdata[i] < *min) *min = tempdata[i]; if (tempdata[i] > *max) *max = tempdata[i]; } /* Compute the mean and median of the unrejected values */ *mean = (float) (sum/(double)npix1); median = findRMedian (tempdata, npix1); /* Subtract the median from every element in the array */ arrayDiff (tempdata, absdev, median, npix1); /* Get the absolute value for each element in the resulting array */ arrayAbs (absdev, npix1); /* Get the median of the absolute deviation array and divide by a constant with some logic attached */ medabsdev = findRMedian (absdev, npix1) / 0.6745; if (medabsdev < 1.0E-24) medabsdev = findMean(absdev,npix1) / 0.8; /* Compute the cutoff value in terms of the median absolute deviation */ cutoff = (sigrej) * medabsdev; /* Flag values in the array that are beyond the cutoff */ wheregood (absdev, cutoff, &npix1); /* Start a new temp array to populate with the good values; npix1 should be the count of unrejected pixels here */ tempdata2 = (float *) calloc(npix1, sizeof(float)); if (tempdata2 == NULL) { sprintf (MsgText, "Memory allocation failure in resistmean"); trlmessage (MsgText); return (1); } /* Copy only the good values into the new temp array. npix is still the number of original input values, while npix1 is now the number of remaining good values. */ j=0; for (i=0; i<npix; i++) { if (absdev[i] != PFLAG) { tempdata2[j]=tempdata[i]; j++; } } /************ ROUND 2 ***********/ /* Compute the mean and stddev of the values in the new array */ *mean = findMean(tempdata2, npix1); *sigmean = findSigma(tempdata2, npix1, mean); /* Compensate sigma for truncation and compute new cutoff */ if (sigrej <= 4.5) { *sigmean = *sigmean / (-0.15405+0.90723*sigrej - 0.23584*sigrej*sigrej+0.020142*sigrej*sigrej*sigrej); } cutoff = sigrej * (*sigmean); /* Reinitialize the absdev array to hold new set of values */ free(absdev); /* clear the old array */ absdev = (float *) calloc(npix1, sizeof(float)); if (absdev == NULL) { sprintf (MsgText, "Memory allocation failure in resistmean"); return (1); } /* Find the median of the good values. */ median = findRMedian(tempdata2, npix1); /* Subtract the median from every element in the array */ arrayDiff (tempdata2, absdev, median, npix1); /* Get the absolute value for each element in the resulting array */ arrayAbs (absdev, npix1); /* Get the median of the absolute deviation array */ medabsdev = findRMedian(absdev, npix1) / 0.6745; if (medabsdev < 1.0E-24) medabsdev = findMean(absdev, npix1) / 0.8; /* Flag values in the array that are beyond the new cutoff */ npix2 = npix1; wheregood(absdev, cutoff, &npix2); /* Start a new temp array to populate with just the final good values */ free (tempdata); /* free the previous copy */ tempdata = (float *) calloc(npix2, sizeof(float)); if (tempdata == NULL) { sprintf (MsgText, "Memory allocation failure in resistmean"); return (1); } /* Copy only the good values to the new array */ j=0; for (i=0; i<npix1; i++) { if (absdev[i] != PFLAG) { tempdata[j] = tempdata2[i]; j++; } } /* Compute the mean and stddev of the latest array of good values */ *mean = findMean (tempdata, npix2); *sigmean = findSigma(tempdata, npix2, mean); /* Compensate sigma for truncation :*/ if (sigrej <= 4.5) { *sigmean = *sigmean / (-0.15405+0.90723*sigrej-0.23584*sigrej*sigrej+0.020142*sigrej*sigrej*sigrej); } /* Free all local arrays */ free(absdev); free(tempdata); free(tempdata2); return (0); /* Successful return */ }