【问题标题】:Diagnosing cause of NaN诊断 NaN 的原因
【发布时间】:2011-12-31 01:17:29
【问题描述】:

我想按列对二维数组求和和平均,如果 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]);  

        }



    }
}

【问题讨论】:

    标签: java arrays nan


    【解决方案1】:

    第一个问题是

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

    条件永远不满足。当您初始化数组 x 时,它是一个原始数组,并且 x 的每个元素都被初始化为 0.0,现在上述条件永远不会满足,因此 sum 数组永远不会更新。这意味着 sum 数组的每个元素也被初始化为零。最后当你除以 0/0 时,结果是 si Nan(k 永远不会增加,因为条件永远不满足)

    【讨论】:

      【解决方案2】:

      首先,如果要读取所有数组,for 循环的索引应该从 0 开始,而不是从 1 开始。

      在这一行

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

      您是说仅当 x[i][j]==1 时才求和,但您尚未使用任何值初始化该数组。因此 k 永远不会更新,所以最后你要除以 0,这就是你得到 NaN 的原因

      【讨论】:

        【解决方案3】:

        这段代码几乎没有简单的答案。

        1. 在 Java 中,数组索引从 0 而不是 1 开始,因此您的 for 循环必须从 0 到长度
        2. 您从未将 X 设置为任何值,因此 if(x[i][j]==1) 永远不会为真
        3. 因为#2,k永远不会递增,所以sum[j] / k总是0/0,也就是NaN

        【讨论】:

        • 我从 1 开始,因为我想看到从 1 到结尾的输出,以及如何将 X 设置为 x[i][j]
        • 如果你想跳过顶行和左列,那么从 1 开始就是你想要的。我不确定您使用 X 做什么,所以我不确定要告诉您将其设置为什么。你的意思是e[i][j] &gt; 0 而不是x[i][j] == 1,如果你想要的是“这个字段不等于零”?
        • 在这里我的意思是如果 x[i][j]==1 它的意思是 e[i][j] 的值不是 =0.0 ,但现在 i 代替了 x " if(e[ i][j]!=0.0){ sum[j] +=e[i][j]; k++;"但输出不是真的,只有第一个 j 是真的
        • 您可能需要在每次运行时重置 K
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-06
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-16
          • 2019-05-30
          相关资源
          最近更新 更多