public static double Mahalanobis(double[] data, WormGene g) { // Compute Mahalanobis distance from worm gene data assert data.length == g.dim; int dim = g.dim; Vector<double[]> eigvec = DataConverter.mat2Jvector(g.eigenvectors); double[] eigval = DataConverter.colMat2Double(g.eigenvalues); for (int i = 0; i < dim; i++) eigval[i] += Configs.MDIS_EPSILON; for (int i = 0; i < dim; i++) assert eigval[i] != 0; RealVector v1 = MatrixUtils.createRealVector(data); RealVector[] vec = new RealVector[dim]; for (int i = 0; i < dim; i++) { vec[i] = MatrixUtils.createRealVector(eigvec.elementAt(i)); } double[] d = new double[dim]; for (int i = 0; i < dim; i++) { d[i] = v1.dotProduct(vec[i]) / Math.sqrt(eigval[i]); } RealVector dis = MatrixUtils.createRealVector(d); return vectorLength(dis); }
public static void M2V() { Mat data = new Mat(3, 4, CvType.CV_32F) { { put(0, 0, 1, 2, 2, 4); put(1, 0, 2, 4, 4, 8); put(2, 0, 3, 6, 6, 12); } }; Vector<double[]> v = DataConverter.mat2Jvector(data); // VecOperation.printVectorArray(v); }