2014-02-16 5 views
1

Я хочу сравнить значение элемента в массиве с соседними элементами (3x3) и найти максимум (рисунок). Мой код ниже не работает. Какая часть пошла не так? enter image description hereМаксимальный элемент в области

int data[10][10] = {}; 
int dataMax[10][10] = {}; 
int r_size = 3; // Size of region to compare 
int h = floor(r_size/2);  

for(int i = h; i < (10 - h ) ; i++){  
    for(int j = h; j < (10 - h); j++){ 
     int max = 0; 

     for(int ii = i - h; ii < (i + h); ii++){ 
      for(int jj = j - h; jj < (j + h ); jj++){ 

       if(data[ii][jj] > max){ 

       max = data[ii][jj]; 

       }else{ 

        dataMax[ii][jj] = 0; 

       } 
      } 
     } 

    dataMax[ii][jj] = data[ii][jj]; 

    } 
} 

[Отредактировано на основе ответа]

int data[10][10] = 
{{0,0,3,0,1,0,0,0,0,1}, 
{0,0,0,2,0,0,0,0,0,0}, 
{0,0,0,0,0,0,1,1,0,0}, 
{0,0,0,0,0,0,0,3,0,0}, 
{0,4,2,0,0,0,0,0,0,0}, 
{0,1,0,0,0,0,0,0,0,0}, 
{0,0,0,0,0,0,0,0,0,0}, 
{0,0,0,0,0,8,1,1,0,0}, 
{0,0,0,0,3,6,0,0,2,0}, 
{2,0,0,0,0,0,0,0,0,0}}; 

int dataMax[10][10] = {}; 
int r_size = 3; // Size of region to compare 
int h = floor(r_size/2.0);  

for(int i = h; i < (10 - h ) ; i++){  //**** correction **** 
    for(int j = h; j < (10 - h); j++){  //**** correction **** 
    int max = 0; 
    int max_x = 0;    //**** correction **** 
    int max_y = 0; 

    for(int ii = i - h; ii <= (i + h); ii++){   //**** correction ****  
     for(int jj = j - h; jj <= (j + h ); jj++){ //**** correction **** 

      if(data[ii][jj] > max){ 

      max = data[ii][jj]; 
      max_x = ii;    //**** correction **** 
      max_y = jj; 

      }else{ 

    //   dataMax[ii][jj] = 0; 

      } 
     } 
    } 

    dataMax[max_x][max_y] = max;  //**** correction **** 

    } 
} 

я ожидаю получить следующее Datamax: enter image description here

+0

Найдено другую ошибку, отредактировал мой ответ (пометили его редактировать) – Till

ответ

1

После может помочь: (https://ideone.com/xJXzp8)

int getMax(int minx, int maxx, int miny, int maxy) 
{ 
    minx = std::max(minx, 0); 
    maxx = std::min(maxx, 10); 
    miny = std::max(miny, 0); 
    maxy = std::min(maxy, 10); 
    int res = data[minx][miny]; 

    for (int x = minx; x != maxx; ++x) { 
     for (int y = miny; y != maxy; ++y) { 
      res = std::max(res, data[x][y]); 
     } 
    } 
    return res; 
} 

void compute() 
{ 
    const int h = 3; // Size of region to compare 

    for (int x = 0; x != 10; ++x) { 
     for (int y = 0; y != 10; ++y) { 
      dataMax[x][y] = getMax(x - h/2, x + h - h/2, 
            y - h/2, y + h - h/2); 
     } 
    } 
} 

void filter() 
{ 
    for (int x = 0; x != 10; ++x) { 
     for (int y = 0; y != 10; ++y) { 
      if (dataMax[x][y] != data[x][y]) { 
       dataMax[x][y] = 0; 
      } 
     } 
    } 
} 
+0

это, похоже, не работает. – askingtoomuch

+0

@boogiedoll: Надеюсь, теперь это именно вы хотите. – Jarod42

+0

Что означает эта ошибка? ошибка C2530: 'a_i': ссылки должны быть инициализированы ошибка C3531: 'a_i': символ, тип которого содержит 'auto', должен иметь инициализатор – askingtoomuch

1

хорошо, одна вещь, это:

int h = floor(r_size/2); 

ч теперь 1.

и:

for(int ii = i - h; ii < (i + h); ii++){ 

итерацию между i-1 к i+1 в общей сложности двух итераций. Вы должны изменить это на <= для трех итераций.

+0

, что глупая ошибка! спасибо – askingtoomuch

+0

, но все равно не смог получить правильный ответ – askingtoomuch

1

В данный момент, когда вы пишете

dataMax[ii][jj] = data[ii][jj]; 

переменные ii, а также jj которые больше не объявлены. Далее: вы не храните значение max в любом месте, что должно произойти, если вы его ищете.

EDIT: Найдено еще одна ошибка в вашем редактирования: попробуйте установить dataMax[max_x][max_y] = max;, потому что вы испортили строки и столбцы data[max_x][max_y] должны были data[max_y][max_x], насколько я могу видеть.

Но так или иначе, поскольку вы храните max, почему бы не использовать его?

+0

о, я вижу ... еще одна глупая ошибка ^^; – askingtoomuch

+0

, но все равно не смог получить правильный ответ – askingtoomuch

+0

@boogiedoll. Тогда вам нужно сказать нам, что происходит не так ?! – Till

Смежные вопросы