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); }
/// <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); }