Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4.  
  5. void min_max_avg(float **grid, int N, int M,
  6.                  float *min, float *max, float *avg,
  7.                  float *col_min, float *col_max, float *col_avg,
  8.                  float *row_min, float *row_max, float *row_avg) {
  9.  
  10.  
  11.     int i, j;
  12.  
  13.  
  14.     // compute overall min, max, row_min, and row_max
  15.  
  16.     //merged min, max, row_min, and row_max into one loop - loop efficiency
  17.     float minimum = INFINITY;   // Use a variable for *max - memory aliasing
  18.     float maximum = -INFINITY;  // Use a variable for *min - memory aliasing
  19.  
  20.     for (i = 0; i < N; i++) {
  21.         row_min[i] = +INFINITY;
  22.         row_max[i] = -INFINITY;
  23.         row_avg[i] = 0;
  24.         for (j = 0; j < M; j++) {
  25.             if (grid[i][j] < minimum) {
  26.                 minimum = grid[i][j];
  27.             }
  28.             if (grid[i][j] > maximum) {
  29.                 maximum = grid[i][j];
  30.             }
  31.  
  32.             if (grid[i][j] < row_min[i]) {
  33.                 row_min[i] = grid[i][j];
  34.             }
  35.             if (grid[i][j] > row_max[i]) {
  36.                 row_max[i] = grid[i][j];
  37.             }
  38.  
  39.         }
  40.     }
  41.     *min = minimum;
  42.     *max = maximum;
  43.  
  44.  
  45.     // compute overall average and row_avg
  46.  
  47.     //merged avg and row_avg into one loop - loop efficiency
  48.     float total = 0; // Use a variable for *avg - memory aliasing
  49.     float rowtotal = 0;
  50.     for (i = 0; i < N; i++) {
  51.         row_avg[i] = 0;
  52.         int rowitem[8] = {0,0,0,0,0,0,0,0}; // unroll the loop into an 8 x 8 - loop efficiency
  53.         for (j = 0; j < M-8; j += 8) {
  54.             rowitem[0] += grid[i][j];
  55.             rowitem[1] += grid[i][j+1];
  56.             rowitem[2] += grid[i][j+2];
  57.             rowitem[3] += grid[i][j+3];
  58.             rowitem[4] += grid[i][j+4];
  59.             rowitem[5] += grid[i][j+5];
  60.             rowitem[6] += grid[i][j+6];
  61.             rowitem[7] += grid[i][j+7];
  62.  
  63.         }
  64.  
  65.         rowtotal =  rowitem[0] +
  66.                     rowitem[1] +
  67.                     rowitem[2] +
  68.                     rowitem[3] +
  69.                     rowitem[4] +
  70.                     rowitem[5] +
  71.                     rowitem[6] +
  72.                     rowitem[7];
  73.  
  74.         for (; j < M; j++) {
  75.             rowtotal += grid[i][j];
  76.         }
  77.         total += rowtotal;
  78.         row_avg[i] = (M != 0) ? rowtotal/(float)M : NAN;
  79.     }
  80.     *avg = (N*M > 0) ? total/(float)(M * N) : NAN;
  81.  
  82.  
  83.  
  84.  
  85.     // compute stats by col
  86.     for (j = 0; j < M; j++) {
  87.         col_min[j] = +INFINITY;
  88.         col_max[j] = -INFINITY;
  89.         col_avg[j] = 0;
  90.         for (i = 0; i < N; i++) {
  91.             if (grid[i][j] < col_min[j]) {
  92.                 col_min[j] = grid[i][j];
  93.             }
  94.             if (grid[i][j] > col_max[j]) {
  95.                 col_max[j] = grid[i][j];
  96.             }
  97.             col_avg[j] += grid[i][j];
  98.         }
  99.         col_avg[j] = (N != 0) ? col_avg[j]/(float)N : NAN;
  100.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement