2016-01-26 5 views
-1

Im пытается вычесть один и тот же элемент из другого массива, то есть [0,0] - [0,0] и [0,1] - [0,1], но я просто получить исключение из массива из пределов, и я не могу понять, почему. Может ли кто-нибудь увидеть проблему с кодом?Индекс вычитания элемента массива за пределы

//pixArray and avgPix already contain data 
int[][] pixArray = new int[35][10]; 
int[][] avgPix = new int[35][1]; 
int[][] correctImg = new int[35][10]; 

public void correctImage() { 
for (int r = 0; r < correctImg.length; r++) { 
     for (int c = 0; c < correctImg[r].length; c++) { 
      correctImg[r][c] = avgPix[r][c] - pixArray[r][c]; 
      System.out.println(correctImg[r][c]); 
     } 
} 
} 

мне также нужно изменить цикл так, что avgPix только петли каждый раз, когда столбец pixArray является 0, потому что avgPix имеет только один столбец может кто-нибудь подскажет, как я могу это сделать?

+6

Любая причина, по которой 'avgPix' является только 35x1 вместо 35x10? Если есть, есть ли причина, почему это 2D вообще? – ryanyuyu

+0

avgPix хранит среднее значение для каждой строки в pixArray, я просто сохранил его в 2D, чтобы не сбиться с пути, я не думаю, что это будет иметь значение. Мне все еще нужно циклировать avgPix каждые 10 раз – Sfitz12173

+0

, вы говорите, что пытаетесь вычесть тот же элемент из двух разных массивов. но avgPix имеет 1 col, поэтому [0], [0] - [0], [0] в порядке, но [0], [1] - [0], [1] - нет. Это из вашего вопроса. может быть, плохой пример? –

ответ

0

При запуске г и с основано на измерении correctImg в [35] [10] и avgPix имеет размеры [35] [1]

int[][] avgPix = new int[35][1]; 

Цикл в соответствующем фрагменте кода использует г и с значением из внешнего/внутреннего цикла, основанного на том, что описано в вопросе, имеет смысл использовать avgPix [r] [0] для всех pixArray [r] [c].

Не уверен, что вы пытаетесь достичь, но что-то, как это будет вычислить разницу со средним

correctImg[r][c] = avgPix[r][0] - pixArray[r][c]  
0

Я не уверен, если я получаю, но если вам нужно выполнить команду correctImg[r][c] = avgPix[r][c] - pixArray[r][c]; только тогда, когда c=0 затем вам не нужно петлю

public void correctImage() { 
    for (int r = 0; r < correctImg.length; r++) { 
     correctImg[r][0] = avgPix[r][0] - pixArray[r][0];    
    } 
} 

Редактировать
после прочтения вашего комментария на ваш вопрос, я все еще не уверен, что вы пытаетесь сделать, (зацикливание avgPix каждый 10-ый время?). Может быть, IF заявлением является более подходящим

0

Второй (бесполезный) размером avgPix является длиной 1, но другие массивы, которые вы перебор длиной 10. Это означает, что, когда c > 0 эти данные точки не существуют в avgPix.

На самом деле, поскольку второе измерение этого массива - длина 1, оно почти бесполезно. Вместо этого вы просто не должны беспокоиться о втором измерении вообще. Чтобы сделать это очевидным:

int[][] pixArray = new int[35][10]; 
int[][] avgPix = new int[35]; //no need for 2D array, since it is an average of row values 
int[][] correctImg = new int[35][10]; 

public void correctImage() { 
    for (int r = 0; r < correctImg.length; r++) { 
     int rowAverage = avgPix[r]; //this doesn't depend on c 

     for (int c = 0; c < correctImg[r].length; c++) { 
      correctImg[r][c] = rowAverage- pixArray[r][c]; 
      System.out.println(correctImg[r][c]); 
     } 
    } 
} 
Смежные вопросы