2014-11-13 4 views
0

Я написал код, чтобы найти median filtering (медианное окно). Но я не могу сделать scannig для каждого числа. Что я могу использовать вместо size в циклах for. Когда я использую размер, он обеспечивает только 5 Также, как насчет границ? Что я могу сделать для boundries? Благодарим вас за все полезные ответы. (Я открыл новую тему, так как пользователи сказали, что каждая тема основана на одном question.If я ошибка, пожалуйста, удалите этот вопрос, я суффикс текущий вопрос)Средние окна в C

<size of array> 
    <size filter> 
    <data> 
    8 
    3 
    0 0 0 0 0 0 0 0 
    0 5 0 0 6 0 0 0 
    0 0 0 0 0 7 0 0 
    0 0 0 0 5 0 0 0 
    0 0 0 5 6 0 0 0 
    0 0 8 5 5 0 0 0 
    0 0 0 7 0 0 9 0 
    0 0 0 0 0 0 0 0 

    Output: 
    0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 
    0 0 0 5 5 0 0 0 
    0 0 0 5 5 0 0 0 
    0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 

#include <stdio.h> 

int median(int a[100],int n); 


int main() 
{ 
    int a[100][100]; 
    int temp[100]; 
    int i,j,k,count=0; 
    int sizefilter; 
    int sizearray; 

    scanf("%d", &sizearray); 
    scanf("%d", &sizefilter); 

    for(i = 0; i < sizearray; i++) 
     for(j = 0; j < sizearray; j++) 
      scanf("%d", &a[i][j]); 

    for(k = 0; k < sizearray; k++) 
     for(i = 0; i < sizefilter; i++) 
      for(j = 0; j < sizefilter; j++) 
      { 
       temp[count] = a[i][j]; 
       count++; 
       a[i][j] = median(temp, count); 
      } 

    printf("\n"); 
    printf("\n"); 

    for(i = 0; i < sizearray; i++) 
     for(j = 0; j < sizearray; j++) 
     { 
      printf("%d ", a[i][j]); 

      if(j == sizearray-1) 
       printf("\n"); 
     } 

    return 0; 
} 

int median(int a[100],int n) 
{ 
    int i,j,t; 
    int result; 
    /* Sorting begins */ 
    for (i = 1 ; i <= n-1 ; i++) 
    {  /* Trip-i begins */ 
     for (j = 1 ; j <= n-i ; j++) 
     { 
      if (a[j] <= a[j+1]) 
      { /* Interchanging values */ 

       t = a[j]; 
       a[j] = a[j+1]; 
       a[j+1] = t; 
      } 
      else continue ; 
     } 
    } /* sorting ends */ 

    /* calculation of median */ 
    if (n % 2 == 0) 
     return result = (a[n/2] + a[n/2+1])/2 ; 
    else 
     return result = a[n/2 + 1]; 
} 

ответ

0

Там некоторые логические ошибки в коде:

  • При фильтрации, вам нужна четыре вложенных циклы: два внешней итерация по столбцам и строкам матрицы, внутренние два итерации по столбцам и строкам площади фильтра. (Это не должно быть для вас новостью, вам уже сказали, что в ответе на ваш предыдущий вопрос.)

  • Ограничения области фильтра просты: левый и верхний индексы не должны опускаться ниже нуля и правый и нижний знаки должны быть меньше sizearray. Если это не так, настройте их.

  • Вам нужны два массива, исходный массив a и второй массив, содержащий отфильтрованные значения. Вы не можете фильтровать на месте, потому что если вы смотрите вверх и влево, вы увидите только отфильтрованные значения, тогда как ваш фильтр всегда должен смотреть на исходные значения.

  • Неправильные петли фильтрации: вы никогда не перезагружаете count, которые вы должны сбросить, конечно, для каждого медианного значения, которое вы вычисляете. Вы также вычисляете медиану во внутреннем цикле, что слишком часто. Решением этого является сделать count локальным для цикла, который накапливает значения фильтра и определяет медиану.

  • Ваша сортировка имеет ошибки индекса. Вместо сравнения i с i + 1, сравнить с'i - 1 . Your indices start from 1, so i - 1` всегда будет действительный индекс.

  • Вы сортируете массив, который отлично подходит для небольших массивов, но в целом медленный. <stdlib.h> имеет qsort, что может быть полезно для общей сортировки.

  • Ваши медианные показатели также отключены одним направо.

Есть также некоторые стилистические вопросы:

  • Пожалуйста, привычка использовать скобки для кодовых блоков для for, while и if. Только очень тривиальные кодовые блоки в самой внутренней области могут быть записаны без брекетов. В вашем случае многое должно быть сделано «между» петлями, и наличие брекетов там упрощает добавление материала.

  • Yor переменная result в median является излишним. Вы назначаете его, а затем сразу теряете переменную, потому что возвращаетесь. Просто возвращения достаточно.

Ниже приведен вариант кода, который дает желаемый результат:

#include <stdint.h> 
#include <stdio.h> 

int min(int a, int b) 
{ 
    return a < b ? a : b; 
} 

int max(int a, int b) 
{ 
    return a > b ? a : b; 
} 

int median(int a[], int n) 
{ 
    int i, j; 

    for (i = 1 ; i < n ; i++) { 
     for (j = 1 ; j < n ; j++) { 
      if (a[j] < a[j - 1]) { 
       int t = a[j]; 
       a[j] = a[j - 1]; 
       a[j - 1] = t; 
      } 
     } 
    } 

    if (n % 2) return a[n/2]; 
    return (a[n/2 - 1] + a[n/2])/2 ;   
} 

int main() 
{ 
    int a[100][100]; 
    int b[100][100]; 
    int temp[100]; 
    int i, j, ii, jj; 
    int sizefilter; 
    int sizearray; 

    scanf("%d", &sizearray); 
    scanf("%d", &sizefilter); 

    for(i = 0; i < sizearray; i++) { 
     for(j = 0; j < sizearray; j++) { 
      scanf("%d", &a[i][j]); 
     } 
    } 

    for(i = 0; i < sizearray; i++) { 
     for(j = 0; j < sizearray; j++) { 
      int imin = max(0, i - sizefilter/2); 
      int imax = min(sizearray, i + sizefilter/2 + 1); 
      int jmin = max(0, j - sizefilter/2); 
      int jmax = min(sizearray, j + sizefilter/2 + 1); 
      int count = 0; 

      for (ii = imin; ii < imax; ii++) { 
       for (jj = jmin; jj < jmax; jj++) { 
        temp[count] = a[ii][jj]; 
        count++; 
       } 
      } 

      b[i][j] = median(temp, count); 
     } 
    } 

    for(i = 0; i < sizearray; i++) { 
     for(j = 0; j < sizearray; j++) { 
      printf("%3d", b[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

как я могу отблагодарить вас? Вы преподаватель в университете? Огромное спасибо. –