分散の計算を一回の参照で済ませる

 以前、自分の書いたJavaのコードを高速にするため、分散の計算コストを減らした方法を見つけてJavaで実装した。

public float[] calcVarianceAndAverage(float[] datas){
	float avg = 0;
	float variance = 0;
	for(float data : datas){
		avg += data;
		variance += data * data;
	}
	avg = avg / datas.length;
	variance = (variance / datas.length) - (avg * avg);
	return new float[]{avg};
}

 単純に説明するとこんな感じかな。
平均の計算→それぞれの値から引く→それぞれの値を二乗
平均の計算→それぞれの値を二乗→平均の二乗から引く
 平均から値を引くのがなくなり、最後に平均の二乗から引くため多分計算コストは減ってる。と、考えるとそんなに計算速度は変わらないかなーと思ってしまった。データの数が増えればそれだけ有利にはなるんだろうが。あと、配列の参照が一回で済んでいるのでその点も幾らか効いているかもしれない。
 暇があったら速度の計測でもしようかな。

 参考サイト