/*******************************************************************************
* Copyright 2007, 2009 Jorge Villalon (jorge.villalon@uai.cl)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package tml.utils;
import org.apache.log4j.Logger;
import Jama.Matrix;
public class MatrixUtils {
private static Logger logger = Logger.getLogger(MatrixUtils.class);
public static Matrix normalizeRows(Matrix m) {
Matrix norm = m.copy();
for (int i = 0; i < m.getRowDimension(); i++) {
Matrix v = m.getMatrix(i, i, 0, m.getColumnDimension() - 1);
for (int j = 0; j < m.getColumnDimension(); j++) {
double normVector = v.normF();
if (normVector == 0) {
if (m.get(i, j) != 0)
logger.warn("Norm is 0 for vector where value was " + m.get(i, j));
norm.set(i, j, 0);
} else if (Double.isNaN(normVector))
logger.error("INVALID NORM FOR DOCUMENT VECTOR (" + i + "," + j);
else
norm.set(i, j, m.get(i, j) / v.normF());
}
}
return norm;
}
public static Matrix normalizeColumns(Matrix m) {
Matrix norm = m.copy();
for (int i = 0; i < m.getColumnDimension(); i++) {
Matrix v = m.getMatrix(0, m.getRowDimension() - 1, i, i);
for (int j = 0; j < m.getRowDimension(); j++) {
double normVector = v.normF();
if (normVector == 0) {
if (m.get(j, i) != 0)
logger.warn("Norm is 0 for vector where value was " + m.get(j, i));
norm.set(j, i, 0);
} else if (Double.isNaN(normVector))
logger.error("INVALID NORM FOR DOCUMENT VECTOR (" + j + "," + i);
else
norm.set(j, i, m.get(j, i) / v.normF());
}
}
return norm;
}
public static Matrix normalizeRowsL1(Matrix m) {
Matrix norm = m.copy();
for (int i = 0; i < m.getRowDimension(); i++) {
double rowNorm1 = m.getMatrix(i, i, 0, m.getColumnDimension() - 1).norm1();
if (rowNorm1 != 0) {
for (int j = 0; j < m.getColumnDimension(); j++) {
norm.set(i, j, m.get(i, j) / rowNorm1);
}
}
}
return norm;
}
public static Matrix normalizeColumnsL1(Matrix m) {
Matrix norm = m.copy();
for (int j = 0; j < m.getColumnDimension(); j++) {
double colNormL1 = m.getMatrix(0, m.getRowDimension() - 1, j, j).norm1();
if (colNormL1 != 0) {
for (int i = 0; i < m.getRowDimension(); i++) {
norm.set(i, j, m.get(i, j) / colNormL1);
}
}
}
return norm;
}
}