Hello,everyone I am new to hama. in our project ,my team leader let me upload old code, run it on hadoop with parallel matrix computation.this is old code:
public class EigenFaceGenerator { Matrix averageFace; //stores the average face useful when probing the database Matrix eigVectors; //stores all the sorted eigen vectors from the training set Matrix eigValues; //Stores all the sorted eigen Values from the training set boolean trained = false; //has a training set been provided yet? int numEigenVecs = 0; //number of eigen vectors availiable /** * * @param faces array of pictures to be used for the training * @param progress */ public void processTrainingSet(Face[] faces) { //TODO : there are errors that can be thrown when no fiels are parsed into here //TODO : Check that all the images are the same size /** * STEP 1 * Read in the images, flatten them out into one row of values, and stack in a big matrix */ double[][] dpix = new double[faces.length][faces[0].picture.getImagePixels().length]; for(int i=0; i<faces.length; i++) { //for each picture in the set double[] pixels = faces[i].picture.getImagePixels(); for (int j=0; j<pixels.length; j++) { dpix[i][j] = pixels[j]; } } //make matrix of stacked flattened images Matrix matrix = new Matrix(dpix); /** * STEP 2 * Calculate the average face, and then take this away from each of the image * effectivly calculating the difference form the average. */ //compute the average image averageFace = new Matrix(1,matrix.getColumnDimension()); for(int i=0; i<matrix.getRowDimension(); i++) { averageFace.plusEquals(matrix.getMatrix(i,i,0,matrix.getColumnDimension() - 1)); } averageFace.timesEquals(1.0/(double)matrix.getRowDimension()); //divide by the number of pixels to get the average Matrix bigAvg = new Matrix(matrix.getRowDimension(), matrix.getColumnDimension()); for (int i=0; i<bigAvg.getRowDimension(); i++) { bigAvg.setMatrix(i,i,0,bigAvg.getColumnDimension()-1,averageFace); } // Compute the diference form the average face for each image Matrix A = matrix.minus(bigAvg).transpose(); /** * STEP 3 * Now compute the the patternwise (nexamp x nexamp) covariance matrix */ // TODO : for the presentation work out why this is done, and what it's telling us Matrix At = A.transpose(); Matrix L = At.times(A); /** * STEP 4 * Calculate the eigen values and vectors of this covariance matrix * * % Get the eigenvectors (columns of Vectors) and eigenvalues (diag of Values) */ EigenvalueDecomposition eigen = L.eig(); eigValues = eigen.getD(); eigVectors = eigen.getV(); /** * STEP 5 * % Sort the vectors/values according to size of eigenvalue */ Matrix[] eigDVSorted = sortem(eigValues, eigVectors); eigValues = eigDVSorted[0]; eigVectors = eigDVSorted[1]; /** * STEP 6 * % Convert the eigenvectors of A'*A into eigenvectors of A*A' */ eigVectors = A.times(eigVectors); /** * STEP 7 * % Get the eigenvalues out of the diagonal matrix and * % normalize them so the evalues are specifically for cov(A'), not A*A'. */ double[] values = diag(eigValues); for(int i = 0; i < values.length; i++) values[i] /= A.getColumnDimension() - 1; /** * STEP 8 * % Normalize Vectors to unit length, kill vectors corr. to tiny evalues */ numEigenVecs = 0; for(int i = 0; i < eigVectors.getColumnDimension(); i++) { Matrix tmp; if (values[i] < 0.0001) { tmp = new Matrix(eigVectors.getRowDimension(),1); } else { tmp = eigVectors.getMatrix(0,eigVectors.getRowDimension()-1,i,i).times( 1 / eigVectors.getMatrix(0, eigVectors.getRowDimension() - 1, i, i).normF()); numEigenVecs++; } eigVectors.setMatrix(0,eigVectors.getRowDimension()-1,i,i,tmp); //eigVectors.timesEquals(1 / eigVectors.getMatrix(0, eigVectors.getRowDimension() - 1, i, i).normInf()); } eigVectors = eigVectors.getMatrix(0,eigVectors.getRowDimension() - 1, 0, numEigenVecs - 1); trained = true; /*System.out.println("There are " + numGood + " eigenVectors\n\nEigenVectorSize"); System.out.println(eigVectors.getRowDimension()); System.out.println(eigVectors.getColumnDimension()); try { PrintWriter pw = new PrintWriter("c:\\tmp\\test.txt"); eigVectors.print(pw, 8, 4); pw.flush(); pw.close(); } catch (Exception e) { e.printStackTrace(); } int width = pics[0].img.getWidth(null); BufferedImage biAvg = imageFromMatrix(bigAvg.getArrayCopy()[0], width); try { saveImage(new File("c:\\tmp\\test.jpg"), biAvg); } catch (IOException e1) { e1.printStackTrace(); }*/ } /** * Returns a number of eigenFace values to be used in a feature space * @param pic * @param number number of eigen feature values. * @return will be of length number or this.getNumEigenVecs whichever is the smaller */ public double[] getEigenFaces(Picture pic, int number) { if (number > numEigenVecs) //adjust the number to the maxium number of eigen vectors availiable number = numEigenVecs; double[] ret = new double[number]; double[] pixels = pic.getImagePixels(); Matrix face = new Matrix(pixels, pixels.length); Matrix Vecs = eigVectors.getMatrix(0,eigVectors.getRowDimension()-1, 0, number-1).transpose(); Matrix rslt = Vecs.times(face); for (int i=0; i<number; i++) { ret[i] = rslt.get(i,0); } return ret; } /** * Gets the diagonal of a matrix * @param M matrix * @return */ private double[] diag(Matrix M) { double[] dvec = new double[M.getColumnDimension()]; for(int i = 0; i < M.getColumnDimension(); i++) dvec[i] = M.get(i, i); return dvec; } /** * Sorts the Eigenvalues and vectors in decending order * * @param D = eigen Values * @param V = eigen Vectors * @return */ private Matrix[] sortem(Matrix D, Matrix V) { //dvec = diag(D); // get diagonal components double[] dvec = diag(D); //NV = zeros(size(V)); //[dvec,index_dv] = sort(dvec); // sort dvec, maintain index in index_dv class di_pair{ double value; int index; }; di_pair[] dvec_indexed = new di_pair[dvec.length]; for(int i = 0; i < dvec_indexed.length; i++) { dvec_indexed[i] = new di_pair(); dvec_indexed[i].index = i; dvec_indexed[i].value = dvec[i]; } Comparator di_pair_sort = new Comparator() { public int compare(Object arg0, Object arg1) { di_pair lt = (di_pair)arg0; di_pair rt = (di_pair)arg1; double dif = (lt.value - rt.value); if(dif > 0) return -1; if(dif < 0) return 1; else return 0; } }; Arrays.sort(dvec_indexed, di_pair_sort); //index_dv = flipud(index_dv); //for i = 1:size(D,1) // ND(i,i) = D(index_dv(i),index_dv(i)); // NV(:,i) = V(:,index_dv(i)); //end; Matrix D2 = new Matrix(D.getRowDimension(), D.getColumnDimension()); Matrix V2 = new Matrix(V.getRowDimension(), V.getColumnDimension()); for(int i = 0; i < dvec_indexed.length; i++) { D2.set(i, i, D.get(dvec_indexed[i].index, dvec_indexed[i].index)); int height = V.getRowDimension() - 1; Matrix tmp = V.getMatrix(dvec_indexed[i].index,dvec_indexed[i].index,0,height); V2.setMatrix(i, i,0,height, tmp); } //TODO : Not sure why, but this has to be flipped - check this out maybe? Matrix V3 = new Matrix(V.getRowDimension(), V.getColumnDimension()); for (int i=0; i<V3.getRowDimension(); i++) { for (int j=0; j< V3.getColumnDimension(); j++) { V3.set(i,j,V2.get(V3.getRowDimension() - i - 1, V3.getColumnDimension() - j - 1)); } } return new Matrix[] { D2, V3 }; } public boolean isTrained() { return trained; } public int getNumEigenVecs() { return numEigenVecs; } } I am not sure this code easily can be parallel computed,or how to change this code to add the parallel compuation.any advice will be appreciated.thanks in advance. -- View this message in context: http://www.nabble.com/Hama--Problem-tp23630187p23630187.html Sent from the Hadoop core-user mailing list archive at Nabble.com.