Java examples for java.lang:Math Matrix
Calculate the covariance matrix
/**/* ww w .j a v a 2 s . c o m*/ * MatrixHelper.java * * Revision History:<br> * Jan 14, 2009 bpaulson - File created * * <p> * * <pre> * This work is released under the BSD License: * (C) 2008 Sketch Recognition Lab, Texas A&M University (hereafter SRL @ TAMU) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Sketch Recognition Lab, Texas A&M University * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY SRL @ TAMU ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL SRL @ TAMU BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * </pre> */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import Jama.Matrix; public class Main{ /** * Calculate the covariance matrix * * @param m * matrix to calculate the covariance of * @return covariance matrix */ public static Matrix cov(Matrix m) { Matrix cov = new Matrix(m.getColumnDimension(), m.getColumnDimension()); for (int e = 0; e < m.getRowDimension(); e++) { for (int i = 0; i < m.getColumnDimension(); i++) { double fcei; fcei = m.get(e, i); if (Double.isNaN(fcei)) { fcei = getColMean(m, i); } else if (Double.isInfinite(fcei) || fcei == Double.MAX_VALUE) { fcei = getColMax(m, i); } else if (fcei == Double.MIN_VALUE) { fcei = getColMin(m, i); } for (int j = 0; j < m.getColumnDimension(); j++) { double fcej; fcej = m.get(e, j); if (Double.isNaN(fcej)) { fcej = getColMean(m, j); } else if (Double.isInfinite(fcej) || fcei == Double.MAX_VALUE) { fcej = getColMax(m, j); } else if (fcei == Double.MIN_VALUE) { fcej = getColMin(m, j); } cov.set(i, j, cov.get(i, j) + (fcei - getColMean(m, i)) * (fcej - getColMean(m, j))); } } } return cov; } /** * Get the mean of a given column of a given matrix * * @param m * matrix * @param col * column number * @return mean of the given column */ public static double getColMean(Matrix m, int col) { double sum = 0; double num = 0; for (int i = 0; i < m.getRowDimension(); i++) { if (!Double.isNaN(m.get(i, col)) && !Double.isInfinite(m.get(i, col))) { sum += m.get(i, col); num++; } } return sum / num; } /** * Get the maximum value within a column of a given matrix * * @param m * matrix * @param col * column number * @return maximum value in the column */ public static double getColMax(Matrix m, int col) { double max = Double.MIN_VALUE; for (int i = 0; i < m.getRowDimension(); i++) { if (!Double.isNaN(m.get(i, col)) && !Double.isInfinite(m.get(i, col)) && m.get(i, col) > max) max = m.get(i, col); } return max; } /** * Get the minimum value within a column of a given matrix * * @param m * matrix * @param col * column number * @return minimum value in the column */ public static double getColMin(Matrix m, int col) { double min = Double.MAX_VALUE; for (int i = 0; i < m.getRowDimension(); i++) { if (!Double.isNaN(m.get(i, col)) && !Double.isInfinite(m.get(i, col)) && m.get(i, col) < min) min = m.get(i, col); } return min; } }