package edu.harvard.mcb.leschziner.util;
public class MatrixUtils {
public static double[] flatten(double[][] matrix) {
int matrixHeight = matrix.length;
int matrixWidth = matrix[0].length;
double[] flattened = new double[matrixWidth * matrixHeight];
// Copy over the kernel contents
for (int i = 0; i < matrixHeight; i++) {
System.arraycopy(matrix[i],
0,
flattened,
i * matrixWidth,
matrixWidth);
}
return flattened;
}
public static float[] flatten(float[][] matrix) {
int matrixHeight = matrix.length;
int matrixWidth = matrix[0].length;
float[] flattened = new float[matrixWidth * matrixHeight];
// Copy over the kernel contents
for (int i = 0; i < matrixHeight; i++) {
System.arraycopy(matrix[i],
0,
flattened,
i * matrixWidth,
matrixWidth);
}
return flattened;
}
public static int[] flatten(int[][] matrix) {
int matrixHeight = matrix.length;
int matrixWidth = matrix[0].length;
int[] flattened = new int[matrixWidth * matrixHeight];
// Copy over the kernel contents
for (int i = 0; i < matrixHeight; i++) {
System.arraycopy(matrix[i],
0,
flattened,
i * matrixWidth,
matrixWidth);
}
return flattened;
}
public static double[][] unflatten(double[] matrix, int width, int height) {
double[][] unflattened = new double[height][width];
for (int i = 0; i < height; i++) {
System.arraycopy(matrix, i * width, unflattened[i], 0, width);
}
return unflattened;
}
public static float[][] unflatten(float[] matrix, int width, int height) {
float[][] unflattened = new float[height][width];
for (int i = 0; i < height; i++) {
System.arraycopy(matrix, i * width, unflattened[i], 0, width);
}
return unflattened;
}
public static int[][] unflatten(int[] matrix, int width, int height) {
int[][] unflattened = new int[height][width];
for (int i = 0; i < height; i++) {
System.arraycopy(matrix, i * width, unflattened[i], 0, width);
}
return unflattened;
}
public static int sum(int[] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}
public static int sum(int[][] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
sum += array[i][j];
}
}
return sum;
}
public static double average(int[] array) {
return sum(array) / array.length;
}
public static double average(int[][] matrix) {
return sum(matrix) / (matrix.length * matrix[0].length);
}
public static double[] upConvertArray(float[] target) {
double[] result = new double[target.length];
for (int i = 0; i < target.length; i++) {
result[i] = target[i];
}
return result;
}
}