Exemple #1
0
        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");
        }