private void buildSamples(string s) { Random rn = new Random(); double mS = maxSample * 1.05; // to make sure we get max sample give random nature of Random function //double minS = maxSample / Variables.Length; // to make sure we get min samples given random nature of Random function sample1 = new double[Variables.Length][]; sample2 = new double[Variables.Length][]; int[] strataCnt = cntDic[s]; int s1 = strataCnt[0] * Variables.Length; int s2 = strataCnt[1] * Variables.Length; double r1 = 1; double r2 = 1; double sr1 = 1; double sr2 = 1; if (s1 > mS) { r1 = mS / s1; sr1 = maxSample / s1; } if (s2 > mS) { r2 = mS / s2; sr2 = maxSample / s2; } int ss1 = System.Convert.ToInt32((sr1 * strataCnt[0])); // / Variables.Length); int ss2 = System.Convert.ToInt32((sr2 * strataCnt[1])); // / Variables.Length); //Console.WriteLine("ss1,ss2 = " + ss1.ToString() + "," + ss2.ToString()); for (int i = 0; i < Variables.Length; i++) { double[] vlArr1 = new double[ss1]; double[] vlArr2 = new double[ss2]; sample1[i] = vlArr1; sample2[i] = vlArr2; } IQueryFilter qf = new QueryFilterClass(); if (StrataField == "") { qf.SubFields = String.Join(",", Variables); } else { qf.SubFields = StrataField + "," + String.Join(",", Variables); string d = ""; if (Sample1.Fields.get_Field(Sample1.FindField(StrataField)).Type == esriFieldType.esriFieldTypeString) { d = "'"; } qf.WhereClause = StrataField + " = " + d + s + d; } ICursor cur = Sample1.Search(qf, false); int[] fldIndexArr = new int[Variables.Length]; double[] minArr = new double[Variables.Length]; double[] maxArr = new double[Variables.Length]; minArr[0] = Double.MaxValue - 100; maxArr[0] = Double.MinValue + 100; for (int i = 0; i < fldIndexArr.Length; i++) { fldIndexArr[i] = cur.FindField(Variables[i]); } IRow rw = cur.NextRow(); int tCnt = 0; double[] vArr = new double[Variables.Length]; double[] vArr2 = new double[Variables.Length]; clusCountDic.Add(s, new int[numberOfBins]); int[] clusVArr = clusCountDic[s]; //Console.WriteLine("Start iteration 1"); while (rw != null && tCnt < ss1) { double nRn = rn.NextDouble(); if (nRn <= r1) { bool checkVls = true; for (int i = 0; i < fldIndexArr.Length; i++) { object vlObj = rw.get_Value(fldIndexArr[i]); if (vlObj == null) { checkVls = false; break; } vArr[i] = System.Convert.ToDouble(vlObj); } if (checkVls) { int clusCl = cluster.computNew(vArr); clusVArr[clusCl] = clusVArr[clusCl] + 1; if (Oridinate) { vArr2 = pca.computNew(vArr); } else { vArr2 = vArr; } for (int i = 0; i < fldIndexArr.Length; i++) { double vl = vArr2[i]; sample1[i][tCnt] = vl; if (vl < minArr[i]) { minArr[i] = vl; } if (vl > maxArr[i]) { maxArr[i] = vl; } } tCnt += 1; } } rw = cur.NextRow(); } double[][] minMax = new double[2][]; minMax[0] = minArr; minMax[1] = maxArr; //Console.WriteLine(String.Join(",", (from double d in minArr select d.ToString()).ToArray())); //Console.WriteLine(String.Join(",", (from double d in maxArr select d.ToString()).ToArray())); minMaxDic1.Add(s, minMax); qf = new QueryFilterClass(); if (StrataField == "") { qf.SubFields = String.Join(",", Variables); } else { qf.SubFields = StrataField + "," + String.Join(",", Variables); string d = ""; if (Sample1.Fields.get_Field(Sample1.FindField(StrataField)).Type == esriFieldType.esriFieldTypeString) { d = "'"; } qf.WhereClause = StrataField + " = " + d + s + d; } cur = Sample2.Search(qf, false); minArr = new double[Variables.Length]; maxArr = new double[Variables.Length]; minArr[0] = Double.MaxValue; maxArr[0] = Double.MinValue; for (int i = 0; i < fldIndexArr.Length; i++) { fldIndexArr[i] = cur.FindField(Variables[i]); } rw = cur.NextRow(); tCnt = 0; clusSampleCountDic.Add(s, new int[numberOfBins]); clusVArr = clusSampleCountDic[s]; //Console.WriteLine("Start iteration2"); while (rw != null && tCnt < ss2) { double nRn = rn.NextDouble(); if (nRn <= r2) { bool checkVls = true; for (int i = 0; i < fldIndexArr.Length; i++) { object vlObj = rw.get_Value(fldIndexArr[i]); if (vlObj == null) { checkVls = false; break; } vArr[i] = System.Convert.ToDouble(vlObj); } if (checkVls) { int clusCl = cluster.computNew(vArr); clusVArr[clusCl] = clusVArr[clusCl] + 1; if (Oridinate) { vArr2 = pca.computNew(vArr); } else { vArr2 = vArr; } for (int i = 0; i < fldIndexArr.Length; i++) { double vl = vArr2[i]; sample2[i][tCnt] = vl; if (vl < minArr[i]) { minArr[i] = vl; } if (vl > maxArr[i]) { maxArr[i] = vl; } } tCnt += 1; } } rw = cur.NextRow(); } minMax = new double[2][]; minMax[0] = minArr; minMax[1] = maxArr; //Console.WriteLine(String.Join(",", (from double d in minArr select d.ToString()).ToArray())); //Console.WriteLine(String.Join(",", (from double d in maxArr select d.ToString()).ToArray())); minMaxDic2.Add(s, minMax); System.Runtime.InteropServices.Marshal.ReleaseComObject(cur); //Console.WriteLine("Finished iterations"); }