2011-11-17 75 views
0

我想按列求和二维数组的总和和平均值,如果e[i][j]的值超过0,则对它进行计数和求和。但我不知道输出是NaN, 我该如何解决这个问题?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]); 

     } 



    } 
} 

回答

1

这里k的值在程序结束时保持为0,因此将0除以0会得到NaN。

1

对于一个简单的答案,这段代码几乎有太多问题。

  1. 在Java中,数组索引0而不是1开始,所以你的for循环必须是从0到长度
  2. 你永远不设置X到任何东西,所以if(x[i][j]==1)是从来没有真正
  3. 因为#2,K是永远不会增加,所以sum[j]/k始终为0/0,这是NaN
+0

我开始1,因为我想看到输出从1到最后,我如何设置X到x [i] [j] – user906147

+0

如果你想跳过最上面一行和左边的列,那么从1开始就是你想要的。我不确定你使用的X是什么,所以我不知道该怎么告诉你设置它。你是指'e [i] [j]> 0'而不是'x [i] [j] == 1',如果你想要的是“这个域不等于零”? – Danalog

+0

在这里,我的意思是如果x [i] [j] == 1这意味着e [i] [j]的值不是= 0.0,但现在我改为x“if(e [i] [j]!= 0.0){ sum [j] + = e [i] [j]; k ++;“但输出不正确,只有第一个j是真的 – user906147

0

首先的索引你的for循环应该从0开始,而不是与1,如果你想阅读所有阵列。

在这一行

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

你说你要只有当x [i] [j] == 1,但你还没有初始化任何值数组来总结。因此k被永远不会更新所以在最后你除以0,这就是为什么你所得到的NaN

0

第一个问题是

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

条件满足永远。当你初始化数组x时,它的一个基本数组和x的每一个元素都被初始化为0.0,现在上面的条件永远不会满足,所以总和数组永远不会更新。这意味着sum arrray的每个元素也被初始化为零。在最后当你分0/0,结果si南(k永远不会增加条件永不满足)