Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法获得标准偏差,我做错了什么?_Java_Math - Fatal编程技术网

Java 无法获得标准偏差,我做错了什么?

Java 无法获得标准偏差,我做错了什么?,java,math,Java,Math,我基本上尝试使用一个数组,它是从文件中读取的数据,然后使用该数组计算数据的平均值和标准偏差 我就是找不到正确的号码 static public double[][] calcStats(String[][] x) throws IOException { double[][] array = new double[7][2]; double total = 0, std_dev = 0, amount = 0; int row2 = 0; for (int row = 1; ro

我基本上尝试使用一个数组,它是从文件中读取的数据,然后使用该数组计算数据的平均值和标准偏差

我就是找不到正确的号码

static public double[][] calcStats(String[][] x) throws IOException {
  double[][] array = new double[7][2];
  double total = 0, std_dev = 0, amount = 0;
  int row2 = 0;
  for (int row = 1; row < x.length; row++) {
    array[row2][0] = (total);
    array[row2][1] = Math.sqrt(amount);
    amount = 0;
    total = 0;
    if (row >= 2) {
      row2++;
    }
    for (int col = 1; col < x[row].length; col++) {
      total += Integer.parseInt(x[row][col]);
      if (col == 4) {
        total = (total / 4);
      }
    }
    for (int col = 1; col < x[row].length; col++) {
      std_dev = (Integer.parseInt(x[row][col])) - (total);
      std_dev = Math.pow(std_dev, 2);
      amount = +std_dev;
      std_dev = 0;
      if (col == 4) {
        amount = (amount / 27);
      }
    }
  }
  array[row2][0] = (total);
  return array;
}
static public double[]]calcStats(字符串[][]x)引发IOException{
双精度[]数组=新的双精度[7][2];
双倍总额=0,标准差=0,金额=0;
int row2=0;
对于(int row=1;row=2){
行2++;
}
对于(int col=1;col
Java中的数组从0开始。您正在从1开始循环。这意味着您缺少每个数组的第一个元素


根据Marko Topolnik的建议,我应该指出我改变了
amount=+std\u dev在原始代码中添加到
amount+=std\u dev。现在想想,这是一个无效的编辑,因为原始代码是一个额外的问题(除了循环限制)。我将编辑回滚到Marco的版本。

这是我在不更改方法签名的情况下编写它的方式

public static double[][] calcStats(String[][] x) {
    double[][] array = new double[x.length][2];
    for (int row = 0; row < x.length; row++) {
        String[] xrow = x[row];
        double total = 0;
        for (String s : xrow)
            total += Integer.parseInt(s);
        double average = total / xrow.length;

        double sqrTotal = 0;
        for (String s : xrow) {
            double d = Integer.parseInt(s) - total;
            sqrTotal += d * d;
        }
        array[row][0] = average;
        array[row][1] = Math.sqrt(sqrTotal);
    }
    return array;
}
publicstaticdouble[]]calcStats(字符串[]]x){
双精度[]数组=新的双精度[x.length][2];
对于(int row=0;row
或者在一次通过中作为

public static double[][] calcStats(String[][] x) {
    double[][] array = new double[x.length][2];
    for (int row = 0; row < x.length; row++) {
        String[] xrow = x[row];
        double sum = 0, sq_sum = 0;
        for (String s : xrow) {
            int d = Integer.parseInt(s);
            sum += d;
            sq_sum += d * d;
        }
        double mean = sum / xrow.length;
        double variance = sq_sum / xrow.length - mean * mean;
        array[row][0] = mean;
        array[row][1] = Math.sqrt(variance);
    }
    return array;
}
publicstaticdouble[]]calcStats(字符串[]]x){
双精度[]数组=新的双精度[x.length][2];
对于(int row=0;row
标准偏差通常在一维数据上,行/列结构的意义是什么?很难计算出代码的一半是什么,或者为什么存在。如果您尝试在调试器中单步执行代码,您可能会看到它真正在做什么,而不是您认为它在做什么。编辑代码时,您没有更正“更正”,而是引入了“更正”,从而更改了OP的原始代码语义。虽然可能更好,但在某种程度上对OP没有帮助。你应该在回答中清楚地指出这个变化。@MarkoTopolnik-True。原始代码为
amount=+std\u dev。这显然是对
amount+=std\u dev。先前的编辑将其更改为
amount=+std\u dev
,这和原来的一样错误。正如编辑注释所解释的,我的编辑是一个重新格式化的代码。当然,这也是错误的,这是重点。我们不会通过编辑来回答问题。@MarkoTopolnik-我同意。我回滚了我的编辑。然而,重新格式化该行隐藏了这样一个事实,即
=+
可能是
+=
的一个打字错误。另一方面,它使错误更加明显,因为许多人会浏览
=+
,甚至没有注意到它实际上不是
+=/code>。任何研究代码语义的人都会注意到错误,而不是打字错误。