import Jama.Matrix; public class MathUtils { final static double lfEps = 0.00000000001; public static void arrSubtrAndStore(double [] arrLfSubFrom, double [] arrLfSub) { for(int i = 0; i < arrLfSub.length; ++i) { arrLfSubFrom[i] -= arrLfSub[i]; } } public static void linCombine(double lfA, double [] arrLfA, double lfB, double [] arrLfB, double [] arrLfStore) { for(int i = 0; i < arrLfStore.length; ++i) { arrLfStore[i] = lfA*arrLfA[i] + lfB * arrLfB[i]; } } public static double [] arrDblCpy(double [] arrLfSrc, int nLen) { double [] arrLfRslt = new double[nLen]; for(int i = 0; i < nLen; ++i) { arrLfRslt[i] = arrLfSrc[i]; } return arrLfRslt; } public static double [] arrDblCpyRange(double [] arrLfSrc, int nStart, int nStop) { int nLen = nStop-nStart; double [] arrLfRslt = new double[nLen]; for(int i = 0; i < nLen; ++i) { arrLfRslt[i] = arrLfSrc[i+nStart]; } return arrLfRslt; } public static String arrToString(double [] arrLfPt) { String strRslt = "("; for(int i = 0; i < arrLfPt.length; ++i) { strRslt = strRslt + (new Double(arrLfPt[i])).toString(); if(i < arrLfPt.length-1) { strRslt += ","; } } strRslt += ")"; return strRslt; } public static double arrDiffDot(double [] arrLf1, double [] arrLf2, double [] arrLfDot) { double lfResult = 0.0; for(int i = 0; i < arrLf1.length; ++i) { double lfTmp = arrLf1[i] - arrLf2[i]; lfResult += lfTmp*arrLfDot[i]; } return lfResult; } public static double arrDot(double [] arrLf1, double [] arrLf2) { double lfResult = 0.0; for(int i = 0; i < arrLf1.length; ++i) { lfResult += arrLf1[i]*arrLf2[i]; } return lfResult; } public static double arrDistSqrd(double [] arrLf1, double [] arrLf2) { double lfResult = 0.0; for(int i = 0; i < arrLf1.length; ++i) { double lfTmp = arrLf1[i] - arrLf2[i]; lfResult += lfTmp*lfTmp; } return lfResult; } public static void arrMults(double [] arrLfMult, double lfMultBy) { for(int i = 0; i < arrLfMult.length; ++i) { arrLfMult[i] *= lfMultBy; } } public static void arrCpy(double [] arrLfSrc, double [] arrLfDst) { for(int i = 0; i < arrLfSrc.length; ++i) { arrLfDst[i] = arrLfSrc[i]; } } public static void normalize(double [] arrLfToNorm) { double lfNorm = arrDot(arrLfToNorm, arrLfToNorm); if(lfNorm < lfEps*lfEps) { return; } lfNorm = 1.0/Math.sqrt(lfNorm); arrMults(arrLfToNorm, lfNorm); } /** * Helper function to force a matrix to be symmetric in the simplest possible way * (just copy (i,j) onto (j,i). * Only useful for matrices that are almost symmetric, except for numerical error * @param M */ static public void makeSymmetric(Matrix M) { for(int i = 0; i < M.getRowDimension(); ++i) { for(int j = i+1; j < M.getColumnDimension(); ++j) { M.set(j, i, 0.5*(M.get(j,i) + M.get(i, j))); M.set(i, j, M.get(j, i)); } } } }