コード例 #1
0
ファイル: Momentum.cs プロジェクト: kryssb/SySal.NET
        private double[][] calculateInverse(ArrayList matrixElement, double p, ref double det)
        {
            double[][] pureMatrix = (double[][])matrixElement[0];
            double[][] errorMatrix = (double[][])matrixElement[1];
            double[][] returnMatrix = new double[pureMatrix.GetLength(0)][];
            int        i, j;

            for (i = 0; i < pureMatrix.GetLength(0); i++)
            {
                returnMatrix[i] = new double[i + 1];

                for (j = 0; j <= i; j++)
                {
#if _USE_G4_
                    returnMatrix[i][j] = (pureMatrix[i][j] * 0.01464 * 0.01464) / (p * p) + errorMatrix[i][j];
#elif _USE_HEURISTIC_
                    returnMatrix[i][j] = (pureMatrix[i][j] * 0.0162 * 0.0162) / (p * p) + errorMatrix[i][j];
#else
                    returnMatrix[i][j] = (pureMatrix[i][j] * 0.0136 * 0.0136) / (p * p) + errorMatrix[i][j];
#endif
                }
            }

            NumericalTools.Cholesky ch = new NumericalTools.Cholesky(returnMatrix, 0);
            det          = ch.Determinant;
            returnMatrix = ch.Inverse(0);
            return(returnMatrix);
        }
コード例 #2
0
ファイル: MapMerge.cs プロジェクト: kryssb/SySal.NET
        /// <summary>
        /// Computes the transformation parameters for a rototranslation with expansion.
        /// </summary>
        /// <param name="xypairs">the set of x,y pairs where displacements are known.</param>
        /// <param name="dxdypairs">the set of deltax,deltay pairs measured.</param>
        /// <returns>the transformation parameters.</returns>
        public static SySal.DAQSystem.Scanning.IntercalibrationInfo FindRototranslation(double[,] xypairs, double[,] dxdypairs)
        {
            double[,] cmat = new double[4, 4];
            double[] v = new double[4];
            int      i, n;

            n = dxdypairs.GetLength(0);
            double avgx = 0.0, avgy = 0.0, x, y;

            for (i = 0; i < n; i++)
            {
                avgx += xypairs[i, 0];
                avgy += xypairs[i, 1];
            }
            avgx /= n;
            avgy /= n;
            SySal.DAQSystem.Scanning.IntercalibrationInfo cal = new SySal.DAQSystem.Scanning.IntercalibrationInfo();
            cal.RX = avgx;
            cal.RY = avgy;
            for (i = 0; i < n; i++)
            {
                x = xypairs[i, 0] - avgx;
                y = xypairs[i, 1] - avgy;

                cmat[0, 0] += x * x + y * y;
                cmat[0, 2] += x;
                cmat[0, 3] += y;
                v[0]       += dxdypairs[i, 0] * x + dxdypairs[i, 1] * y;

                cmat[1, 1] += x * x + y * y;
                cmat[1, 2] += y;
                cmat[1, 3] -= x;
                v[1]       += dxdypairs[i, 0] * y - dxdypairs[i, 1] * x;

                cmat[2, 0] += x;
                cmat[2, 1] += y;
                cmat[2, 2] += 1.0;
                v[2]       += dxdypairs[i, 0];

                cmat[3, 0] += y;
                cmat[3, 1] -= x;
                cmat[3, 3] += 1.0;
                v[3]       += dxdypairs[i, 1];
            }
            NumericalTools.Cholesky ch = new NumericalTools.Cholesky(cmat, 1.0e-8);
            v       = ch.Solve(v);
            cal.MXX = cal.MYY = 1.0 + v[0];
            cal.MXY = v[1];
            cal.MYX = -v[1];
            cal.TX  = v[2];
            cal.TY  = v[3];
            return(cal);
        }