예제 #1
0
 /// <summary>
 /// 統計情報を計算し格納する
 /// z = 0.904をデフォルトとする、このとき中央値から65%を網羅できる
 /// </summary>
 /// <param name="z">標準正規分布表のZ</param>
 public void CalcMedianBoneRange(double z = 0.904)
 {
     foreach (Bone bone in this.bones)
     {
         List <double> data = this.boneLengthSqLog[bone];
         int           skip = (int)(data.Count() * 0.3);
         int           take = data.Count() - skip * 2;
         data.Sort();
         // 上下30%を削除
         data = data.Skip(skip).Take(take).ToList();
         double         median    = CalcEx.GetMedian(data);
         double         average   = data.Average();
         double         std       = Math.Abs(Math.Sqrt(data.Select(d => Math.Pow(d - average, 2)).Sum() / (data.Count() - 1)));
         double         minLength = median - std * z;
         double         maxLength = median + std * z;
         BoneStatistics bs        = new BoneStatistics(minLength, maxLength, median, average, std);
         this.boneLengthSqStatistics.Add(bone, bs);
     }
 }
 /// <summary>
 /// 統計情報を計算し格納する
 /// z = 0.904をデフォルトとする、このとき中央値から65%を網羅できる
 /// </summary>
 /// <param name="z">標準正規分布表のZ</param>
 public void CalcMedianBoneRange(double z = 0.904)
 {
     foreach (Bone bone in this.bones)
     {
         List<double> data = this.boneLengthSqLog[bone];
         int skip = (int)(data.Count() * 0.3);
         int take = data.Count() - skip * 2;
         data.Sort();
         // 上下30%を削除
         data = data.Skip(skip).Take(take).ToList();
         double median = CalcEx.GetMedian(data);
         double average = data.Average();
         double std = Math.Abs(Math.Sqrt(data.Select(d => Math.Pow(d - average, 2)).Sum() / (data.Count() - 1)));
         double minLength = median - std * z;
         double maxLength = median + std * z;
         BoneStatistics bs = new BoneStatistics(minLength, maxLength, median, average, std);
         this.boneLengthSqStatistics.Add(bone, bs);
     }
 }