package com.felix.util; /** * Some methods around array calculations. * * @author felix * */ public class ArrayUtil { /** * Return percentage value from fracture. * * @param nom * @param den * @return Tpercentage value from fracture. */ public static int percent(int nom, int den) { return (int) Math.round(100 * ((double) nom / den)); } /** * Return sum of the ith row. * * @param a * @param rowIndex * @return The sum of the ith row. */ public static int rowSum(int[][] a, int rowIndex) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (i == rowIndex) { sum += a[i][j]; } } } return sum; } /** * Return sum of values in a sub matrix. * * @param a * @param startCol * @param endCol * @param startRow * @param endRow * @return The sum of values in a sub matrix. */ public static int subMatrixSum(int[][] a, int startCol, int endCol, int startRow, int endRow) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (i >= startRow && i <= endRow && j >= startCol && j <= endCol) { sum += a[i][j]; } } } return sum; } /** * Return a submatrix for a given matrix. * * @param a * @param startCol * @param endCol * @param startRow * @param endRow * @return A submatrix for a given matrix. */ public static int[][] subMatrix(int[][] a, int startCol, int endCol, int startRow, int endRow) { int rowNum = a.length; int colNum = a[0].length; int[][] newAarry = new int[endRow - startRow + 1][endCol - startCol + 1]; int newRow = 0, newCol = 0; for (int i = 0; i < rowNum; i++) { newCol = 0; for (int j = 0; j < colNum; j++) { if (i >= startRow && i <= endRow && j >= startCol && j <= endCol) { newAarry[newRow][newCol] = a[i][j]; newCol++; } } if (i >= startRow && i <= endRow) { newRow++; } } return newAarry; } /** * Return the sum of a part of the ith row. * * @param a * @param rowIndex * @param startCol * @param endCol * @return The sum of a part of the ith row. */ public static int partOfRowSum(int[][] a, int rowIndex, int startCol, int endCol) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (i == rowIndex && j >= startCol && j <= endCol) { sum += a[i][j]; } } } return sum; } /** * Return sum of the ith column. * * @param a * @param colIndex * @return The sum of the ith column. */ public static int colSum(int[][] a, int colIndex) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (j == colIndex) { sum += a[i][j]; } } } return sum; } /** * Return sum of part of the ith column. * * @param a * @param colIndex * @param startRow * @param endRow * @return The sum of part of the ith column. */ public static int partOfColSum(int[][] a, int colIndex, int startRow, int endRow) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (j == colIndex && i >= startRow && i <= endRow) { sum += a[i][j]; } } } return sum; } /** * Return the sum of a one dimensional array. * * @param a * @return The sum of a one dimensional array. */ public static int sum(int[] a) { int rowNum = a.length; int sum = 0; for (int i = 0; i < rowNum; i++) { sum += a[i]; } return sum; } /** * Return the sum of all values in an array. * * @param a * @return The sum of all values in an array. */ public static int sum(int[][] a) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { sum += a[i][j]; } } return sum; } /** * Return the sum of all diagonal (i==j) elements. * * @param a * @return The sum of all diagonal (i==j) elements. */ public static int diagSum(int[][] a) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (i == j) { sum += a[i][j]; } } } return sum; } /** * Return the sum of all elements except diagonal (i==j) ones. * * @param a * @return The sum of all elements except diagonal (i==j) ones. */ public static int noDiagSum(int[][] a) { int rowNum = a.length; int colNum = a[0].length; int sum = 0; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (i != j) { sum += a[i][j]; } } } return sum; } /** * Get zero filled array with row number == column number. * * @param rowNum * @return A zero filled array with row number == column number. */ public static int[][] getZeroQuadraticArray(int rowNum) { return getZeroArray(rowNum, rowNum); } /** * Get zero filled array. * * @param rowNum * @param colNum * @return A zero filled array. */ public static int[][] getZeroArray(int rowNum, int colNum) { int[][] retA = new int[rowNum][colNum]; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { retA[i][j] = 0; } } return retA; } /** * Get formatted string representation. * * @param a * @return A formatted string representation. */ public static String toString(int[][] a) { int rowNum = a.length; int colNum = a[0].length; String ret = ""; for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (colNum == 0) { ret += "\n"; } ret += "\t" + a[i][j]; } } return ret; } /** * Get a formatted String version for a confusion matrix. * * @param a * The matrix. * @param cats * The names of categories (MUST be same dimension). * @return A formatted String version for a confusion matrix. */ public static String toStringConfMatrix(int[][] a, String[] cats) { int rowNum = a.length; int colNum = a[0].length; String ret = "r\\p\t"; for (int i = 0; i < cats.length; i++) { ret += cats[i] + "\t"; } for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (j == 0) { ret += "\n" + cats[i]; } ret += "\t" + a[i][j]; } } return ret; } /** * Get a formatted String version for a confusion matrix for relative * values. * * @param a * The matrix. * @param cats * The names of categories (MUST be same dimension). * @return A formatted String version for a confusion matrix for relative * values. */ public static String toStringRelativeConfMatrix(int[][] a, String[] cats) { int rowNum = a.length; int colNum = a[0].length; String ret = "r\\p\t"; for (int i = 0; i < cats.length; i++) { ret += cats[i] + "\t"; } for (int i = 0; i < rowNum; i++) { for (int j = 0; j < colNum; j++) { if (j == 0) { ret += "\n" + cats[i]; } ret += "\t" + percent(a[i][j], rowSum(a, i)); } } return ret; } }