コード例 #1
0
ファイル: RBF.cs プロジェクト: GMTurbo/Free-Form-Matcher
        public static void fit_mat(out double[,] A, CenterArrayNode CenterNode, IBasisFunction rbf, IRBFPolynomial Poly, double Relaxation)
        {
            // find out
            int dim = CenterNode.Centers.Count;
            int fits = dim;

            fits += Poly.Terms;// for polynomial terms

            A = new double[fits, fits];
            // create A matrix
            double r;
            double a = 0;//for scaling relaxation parameter
            int i, j;
            for (i = 0; i < dim; ++i)
            {
                for (j = i + 1; j < dim; ++j)
                {
                    // PHI11 - PHINN
                    r = CenterNode[j].radius(CenterNode[i].ToArray());
                    A[i, j] = A[j, i] = rbf.val(r); // symmetric
                    a += 2 * r;
                }
            }
            a /= dim * dim; // calculate relaxation normalizer
            //a /= fits * fits; // fits = dims + Poly.Terms(3)
            //a /= Math.Pow(fits, 2);
            // calculate fit mat diagonals and poly terms
            double relax = Relaxation;
            for (i = 0; i < dim; ++i)
            {
                //A[i, i] = BLAS.is_equal(relax, 0) ? 1 : a * a * relax;
                A[i, i] = a * a * relax;

                for (j = 0; j < Poly.Terms; j++)
                    A[i, dim + j] = A[dim + j, i] = Poly.FitMat(i, j);

                #region old
                //A[i, dim + 0] = A[dim + 0, i] = Centers[i][0];
                //A[i, dim + 1] = A[dim + 1, i] = Centers[i][1];

                //// poly values: Ax + By + C POLY
                //A[i, dim + 2] = A[dim + 2, i] = 1;

                // poly values: Ax + By + Cxy POLY
                //A[i, dim + 2] = A[dim + 2, i] = Centers[i][1] * Centers[i][0];

                // parabaloid values: A(x-h)^2 + B(y-k)^2 POLY
                //A[i, dim + 0] = A[dim + 0, i] = Math.Pow(Centers[i][0] - middle[0],2);
                //A[i, dim + 1] = A[dim + 1, i] = Math.Pow(Centers[i][1] - middle[1], 2);
                #endregion
            }
        }
コード例 #2
0
ファイル: RBF.cs プロジェクト: GMTurbo/Free-Form-Matcher
        public static int solve(double[,] A, double[] fitz, CenterArrayNode CenterNode, IRBFPolynomial Poly)
        {
            System.Diagnostics.Debug.Assert(fitz.Length == A.GetLength(0));
            System.Diagnostics.Debug.Assert(A.GetLength(0) == A.GetLength(1));

            int[] pivot = new int[A.GetLength(0)];
            int i;//,j,k;

            //double[] d = new double[A.Length];
            //for (j = 0; j < A.GetLength(0); j++)
            //     for (k = 0; k < A.GetLength(1); k++)
            //          d[k + j * A.GetLength(0)] = A[j, k];

            //DumpD(d, A.GetLength(1), A.GetLength(0), "c:\\before.csv");
            double[,] fit = new double[fitz.Length, 1];
            for (i = 0; i < fitz.GetLength(0); i++)
                fit[i, 0] = fitz[i];
            double[,] w2 = BLAS.SimultaneousSolver(A, fit);
               //var matrixA = new DenseMatrix(A);
               //var vectorB = new DenseVector(fitz);
               //Vector<double> resultX = matrixA.LU().Solve(vectorB);
            //MCroutPPS.Decomp(Tolerance, ref d, ref pivot, ref error, A.GetLength(1), A.GetLength(0));

            //DumpD(d, A.GetLength(1), A.GetLength(0), "c:\\after.csv");

            //if (error <= 0)
            //{
            //	return error;
            //}

            //double[] w = new double[A.GetLength(0)];// create weights vector
            double[] w = new double[A.GetLength(0)];
            for (i = 0; i < w2.GetLength(0); i++)
                w[i] = w2[i, 0];
            //MCroutPPS.Desolv(ref d, ref w, ref fitz, ref pivot, ref error, A.GetLength(0));

            //DumpW(w, "c:\\w.csv");
            i = 0;
            foreach (double weight in w)
            {
                if (i < CenterNode.Centers.Count)
                    CenterNode[i].w = weight; // set the center's weight
                else
                    Poly[i - CenterNode.Centers.Count] = weight;
                //polycofs[i - Centers.Count] = weight; //store the polynomial coefficients

                ++i;
            }

            return 0;
        }
コード例 #3
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="pnt"></param>
 /// <param name="centers"></param>
 /// <param name="rbf"></param>
 /// <param name="doneEvent"></param>
 public PointThread(double[] pnt, List<IAttribute> centers, IBasisFunction rbf, ManualResetEvent doneEvent)
 {
     m_p = pnt;
        Rbf = rbf;
        List<ICenter<double>> tmp = new List<ICenter<double>>(centers.Count);
        centers.ForEach(delegate(IAttribute atr) { tmp.Add(atr as ICenter<double>); });
        m_centers = new CenterArrayNode(null, tmp);
        m_doneEvent = doneEvent;
 }
コード例 #4
0
ファイル: RBF.cs プロジェクト: GMTurbo/Free-Form-Matcher
        public static int solve(double[,] A, double[] fitz, CenterArrayNode CenterNode, IRBFPolynomial Poly, bool MathNet)
        {
            var matrixA = new DenseMatrix(A);
               var vectorB = new DenseVector(fitz);
               //Vector<double> resultX = matrixA.LU().Solve(vectorB);
               Vector<double> resultX = matrixA.QR().Solve(vectorB);

               //matrixA.GramSchmidt().Solve(vectorB, resultX);
               List<double> w2 = new List<double>(resultX.ToArray());

               int i = 0;

               w2.ForEach((double weight) =>
               {
                    if (i < CenterNode.Centers.Count)
                         CenterNode[i].w = weight; // set the center's weight
                    else
                         Poly[i - CenterNode.Centers.Count] = weight;//store the polynomial coefficients

                    ++i;
               });

               return 0;
        }