2

私は基本的に、ファイルから読み取られるデータである配列を使用しようとしています。次に、その配列を使用して、データから平均と標準偏差を計算します。

正しい数値が得られないようです。

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;
}
4

2 に答える 2

5

Java の配列は 0 から始まります。ループは 1 から始まります。これは、各配列の最初の要素が欠落していることを意味します。

amount =+ std_dev;Marko Topolnik の提案に従って、元のコードをに変更したことを指摘しておきますamount += std_dev;。考えてみると、これは無効な編集でした。元のコードには追加の問題 (ループ制限以外) があったからです。編集をマルコのバージョンに戻しました。

于 2012-11-01T18:48:02.133 に答える
3

これは、メソッドの署名を変更せずに書く方法です。

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;
}

または単一のパスで

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;
}
于 2012-11-01T19:01:14.060 に答える