как найти сумму всех значений в int[][] Java?

у меня есть массив целых массивов 'int пикселей [][]'

и я хочу найти сумму всех из них, чтобы я мог найти среднее значение пикселя

это будет использоваться, чтобы я мог установить среднее значение пикселя в качестве порогового значения для изображения pbm.

если значение выше порога, я экспортирую белый пиксель, если ниже, я экспортирую черный (просто чтобы дать некоторый контекст)

я предполагаю, что приведенный ниже код вообще неверен, поскольку на выходе он 6.0, но я думаю, что это что-то вроде этого

   double threshold = 0;
   for(int i = 0; i < pixels.length; i++)
   {
       threshold += (double)pixels[i][i];
   }
   System.out.print(threshold);

person AngryDuck    schedule 20.02.2013    source источник
comment
Перебирайте каждую строку и перебирайте каждую ячейку, чтобы сложить все. Для этого вам понадобятся вложенные циклы.   -  person jlordo    schedule 20.02.2013
comment
Вы можете использовать 2 вложенных цикла для достижения всех элементов.   -  person Henry    schedule 20.02.2013


Ответы (5)


Вы хотите перебрать все числа в массивах, вы можете попробовать это:

           double threshold = 0;
           for(int i = 0; i < pixels.length; i++)
           {
               for(int j=0;j<pixels[i].length;j++){
                   threshold += (double)pixels[i][j];
               }
           }
           System.out.print(threshold);
person Jason    schedule 20.02.2013
comment
спасибо, я понял это почти сразу, как только опубликовал его (всегда помогает напечатать или обсудить проблему, обычно обнаруживается, что в одиночку это дает ответ) в любом случае, вы были правы, так что плохо принимаю ответ - person AngryDuck; 20.02.2013
comment
@user1110338 user1110338 - Если это правильный ответ на ваш вопрос, отметьте его как таковой независимо от того, исправили ли вы его самостоятельно или нет. - person webnoob; 20.02.2013

НАМЕКАТЬ

У вас есть двумерный массив, поэтому для добавления каждого элемента вам нужно пройти каждый столбец каждой строки. Для этого могут пригодиться 2 цикла for.

пройтись по каждому значению и добавить их

выход из цикла

Разделите вашу сумму на количество элементов, чтобы получить среднее значение (возможно, вам придется подумать о приведении типов здесь)

person Mukul Goel    schedule 20.02.2013

Вам нужно перебрать каждую строку и столбец в массиве, поэтому вам нужно 2 цикла for. То, чем вы сейчас занимаетесь, касается только следующего: (0,0), (1,1), (2,2), ....

Это будет работать: (при условии, что массив без зубцов, по крайней мере, для расчета порога)

long sum = 0;
for (int i = 0; i < pixels.length; i++)
for (int j = 0; j < pixels[i].length; j++)
{
   sum += pixels[i][j];
}
double threshold = (double)sum / (pixels.length * pixels[0].length);
System.out.print(threshold);

Или проще: (при условии, что массив не зазубренный, по крайней мере, для расчета порога)

long sum = 0;
for (int[] i: pixels)
for (int j: i)
{
   sum += j;
}
double threshold = (double)sum / (pixels.length * pixels[0].length);
System.out.print(threshold);
person Bernhard Barker    schedule 20.02.2013

Вам нужно использовать двойной for здесь. Что-то вроде этого:-

for(int i = 0; i < pixels.length; i++){
        for(int i = 0; i < pixels[i].length; i++){
               threshold += (double)pixels[i][j];
        }
}
person RainMaker    schedule 20.02.2013
comment
+ = не оператор, += есть. - person jlordo; 20.02.2013
comment
Я забрал свой -1 обратно, так как вы убрали ошибку. Я советую вам написать код в вашей среде IDE, а затем скопировать/вставить свой ответ здесь. Это предотвратит такие ошибки компилятора. - person jlordo; 20.02.2013

вам не нужен двойной, когда вы считаете сумму целых чисел, это пустая трата времени, используйте long, это быстрее

    long sum = 0;
    int n = 0;
    for (int[] a : pixels) {
        for (int e : a) {
            sum += e;
            n++;
        }
    }
    double avg = ((double) sum) / n;
person Evgeniy Dorofeev    schedule 20.02.2013
comment
небольшая оптимизация: n += a.length; перед внутренним циклом ;) - person jlordo; 20.02.2013