プロジェクトで EJML ライブラリを使用しています。SimpleMatrix 行ベクトルの分散を計算するメソッドを作成しました。ある時点で、このメソッドに等しい要素のベクトルを渡すと、分散 > 0.0 になることに気付きました。
さらに調査するためにこれを書きましたが、前の印刷では出力が生成されなかったにもかかわらず、最後の行が誤って印刷されることに驚きました。
// rowVec is a 1xn SimpleMatrix of equal double elements
double one = rowVec.get(0);
for (int i = 0; i < rowVec.getNumElements(); i++) {
if (rowVec.get(i) - one != 0 || rowVec.get(i) != one) {
System.out.println(rowVec.get(i)); // no output here
}
}
// why false below???
System.out.println(one == (rowVec.elementSum() / rowVec.getNumElements()));
// why true below???
System.out.println(one*rowVec.getNumElements() < rowVec.elementSum());
等しい要素のベクトルの平均値がその要素の 1 つよりも大きい理由を誰か説明してもらえますか?
フォローアップ: 私の問題を解決しました:
/**
* Calculates the variance of the argument matrix rounding atoms to the 10th
* significant figure.
*/
public static double variance(SimpleMatrix m) {
Preconditions.checkArgument(m != null, "Matrix argument is null.");
Preconditions.checkArgument(m.getNumElements() != 0, "Matrix argument empty.");
if (m.getNumElements() == 1) return 0;
double mean = m.elementSum() / m.getNumElements();
double sqDiviations = 0;
for (int i = 0; i < m.getNumElements(); i++) {
sqDiviations += Math.pow(decimalRoundTo(mean - m.get(i), 10), 2);
}
return sqDiviations / m.getNumElements();
}
/** Rounds a double to the specified number of significant figures. */
public static double decimalRoundTo(double d, int significantFigures) {
double correctionTerm = Math.pow(10, significantFigures);
return Math.round(d * correctionTerm) / correctionTerm;
}