Диагностика причины NaN - PullRequest
0 голосов
/ 17 ноября 2011

Я хочу суммировать и усреднять 2D массив по столбцам, и если значение e[i][j] больше 0, считать и суммировать его.Но я не знаю, что вывод NaN, как я могу это исправить?

public class d_2DArray {

    public static void main(String [] args){



      double[][] e=   {{0.0,0.0,0.0,0.0},
                        {0.0,0.6,0.0,0.0},
                        {0.0,0.2,0.5,0.1},
                        {0.0,0.2,0.5,0.4},
                        {0.0,0.2,0.5,0.7},
                        {0.0,0.0,0.0,0.9}};



        double[] avg= new double[4];  
        double[] sum= new double[4];
        int i,j,k=0;
        int[][] x=new int [6][4] ;

            //average of column  


        for(j=1;j<e[1].length;j++){   


            sum[j]=0.0;

             for( i= 1; i < e.length; i++)

            if(x[i][j]==1){
                sum[j] +=e[i][j];
                k++;
        }
        avg[j]= sum[j]/k ; 

          System.out.println("Average j="+avg[j]);  

        }



    }
}

Ответы [ 4 ]

1 голос
/ 17 ноября 2011

В этом коде слишком много проблем для простого ответа.

  1. В Java индексы массива начинаются с 0, а не с 1, поэтому цикл for должен быть от 0 до длины
  2. Вы никогда не устанавливаете X на что-либо, поэтому if(x[i][j]==1) никогда не соответствует действительности
  3. Из-за # 2 k никогда не увеличивается, поэтому sum[j] / k всегда равно 0/0, то есть NaN
1 голос
/ 17 ноября 2011

здесь значение k остается 0 в конце программы, поэтому деление 0 на 0 дает NaN.

0 голосов
/ 17 ноября 2011

Первая проблема:

   if(x[i][j]==1){
                    sum[j] +=e[i][j];
                    k++;
            }

Условие никогда не удовлетворяет.Когда вы инициализировали массив x, его примитивный массив и каждый элемент x были инициализированы в 0.0, теперь вышеприведенное условие никогда не удовлетворяет, поэтому массив sum никогда не обновляется.Это означает, что каждый элемент массива суммы также инициализируется нулем.в конце, когда вы делите 0/0, результат si Nan (k никогда не увеличивается, так как условие никогда не удовлетворяет)

0 голосов
/ 17 ноября 2011

Прежде всего, индексы вашего цикла for должны начинаться с 0, а не с 1, если вы хотите прочитать весь массив.

В этой строке

if(x[i][j]==1){
        sum[j] +=e[i][j];
        k++;
}

выговоря, что вы собираетесь суммировать только тогда, когда x [i] [j] == 1, но вы не инициализировали этот массив каким-либо значением.Таким образом, k никогда не обновляется, поэтому в конце вы делитесь на 0, и поэтому вы получаете NaN

...