Как рассчитать среднее значение каждого столбца в 2D-массиве?
Я пытаюсь вычислить среднее значение столбцов в 2D-массиве, но не могу понять код. Функция должна возвращать среднее значение каждого столбца. И я не могу распечатать результат в функции. Печать должна быть в основной функции.
static double average_columns(double matrix[][]) {
int i, j, sum = 0, average=0;
for (i = 0; i < matrix.length; i++) {
for (j = 0; j < matrix[i].length; j++) {
sum=(int) (sum+matrix[i][j]);
}
average=sum/matrix[i].length;
sum=0;
}
return average;
}
Ответы
Вот как вы можете рассчитать сумму и средние значения для каждой строки и столбца: приведенный ниже пример кода будет печатать сумму и средние значения одним и тем же методом и не будет возвращать никакого значения. Если вам нужно вернуть фактическую сумму и среднее значение, вам нужно вернуть double [], который будет содержать все суммы или средние значения вместо double.
КОД
public class Test {
static int m = 3;
static int n = 3;
public static void main(String[] args) {
int i,j;
int [][]matrix = new int[m][n];
int x = 1; // x fills up the value of the matrix
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
matrix[i][j] = x++;
System.out.println("The matrix is : \n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println("\nPrinting the avg of each col ::");
average_columns(matrix);
System.out.println("\nPrinting the avg of each row ::");
average_rows(matrix);
System.out.println("\nPrinting the sum of each col ::");
sum_columns(matrix);
System.out.println("\nPrinting the sum of each row ::");
sum_rows(matrix);
}
public static void average_rows(int matrix[][]) {
int i, j;
double sum = 0, average = 0;
for (i = 0; i < matrix.length; i++) {
for (j = 0; j < matrix[i].length; j++) {
sum=sum+matrix[i][j];
}
average=sum/matrix[i].length;
System.out.println("Average of row " + (i+1) + " = " + average);
sum=0;
}
}
public static void average_columns(int matrix[][]) {
int i, j;
double sum = 0, average = 0;
for (i = 0; i < matrix.length; i++) {
for (j = 0; j < matrix[i].length; j++) {
sum=sum+matrix[j][i];
}
average=sum/matrix[i].length;
System.out.println("Average of column " + (i+1) + " = " + average);
sum=0;
}
}
public static void sum_columns(int matrix[][]) {
int i,j;
double sum = 0;
for (i = 0; i < matrix.length; ++i) {
for (j = 0; j < matrix.length; ++j) {
sum = sum + matrix[j][i];
}
System.out.println("Sum of column " + (i+1) + " = " + sum);
sum = 0;
}
}
public static void sum_rows(int matrix[][]) {
int i,j;
double sum = 0;
for (i = 0; i < matrix.length; ++i) {
for (j = 0; j < matrix.length; ++j) {
sum = sum + matrix[i][j];
}
System.out.println( "Sum of row " + (i+1) + " = " + sum);
sum = 0;
}
}
}
ВЫВОД
The matrix is :
1 2 3
4 5 6
7 8 9
Printing the avg of each col ::
Average of column 1 = 4.0
Average of column 2 = 5.0
Average of column 3 = 6.0
Printing the avg of each row ::
Average of row 1 = 2.0
Average of row 2 = 5.0
Average of row 3 = 8.0
Printing the sum of each col ::
Sum of column 1 = 12.0
Sum of column 2 = 15.0
Sum of column 3 = 18.0
Printing the sum of each row ::
Sum of row 1 = 6.0
Sum of row 2 = 15.0
Sum of row 3 = 24.0
Если вы предположите NxNматрицу, вы можете решить с помощью потоков:
double[][] matrix = { { 1, 5, 15}, { 1, 2, 2}, { 25, 109, 150} };
List<Double> column_average = Arrays.stream(IntStream.range(0, matrix[0].length)
.mapToObj(c1 -> Arrays.stream(matrix).mapToDouble(doubles -> doubles[c1]).toArray())
.toArray(double[][]::new))
.map(i -> Arrays.stream(i).average().getAsDouble())
.collect(Collectors.toList());
или более читаемый
double[][] matrix_transpose = IntStream.range(0, matrix[0].length)
.mapToObj(c -> Arrays.stream(matrix).mapToDouble(doubles -> doubles[c]).toArray())
.toArray(double[][]::new);
List<Double> column_average = Arrays.stream(matrix_transpose)
.map(col -> Arrays.stream(col).average().getAsDouble())
.collect(Collectors.toList());
Вы выполняете транспонирование матрицы, а затем используете ее Arrays.stream(...).average().getAsDouble()для вычисления средних значений массивов.
- Вам нужно вернуть
double[]вместо adoubleиз функции. - Поскольку числа относятся к типу,
doubleтипsumдолжен бытьdouble.
Если все строки одинаковой длины:
- Поскольку вы хотите добавить значения каждого столбца, вы должны добавить
matrix[j][i](вместоmatrix[i][j]) вsumи соответственноaverage[i]будетsum / matrix.length.
Демо:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// Test
double[][] nums = { { 10, 15, 20 }, { 1, 2, 3 }, { 5, 10, 15 } };
System.out.println(Arrays.toString(averageColumns(nums)));
}
static double[] averageColumns(double matrix[][]) {
int i, j;
double[] average = new double[matrix.length];
for (i = 0; i < matrix.length; i++) {
double sum = 0;
for (j = 0; j < matrix[i].length; j++) {
sum += matrix[j][i];
}
average[i] = sum / matrix.length;
}
return average;
}
}
Вывод:
[5.333333333333333, 9.0, 12.666666666666666]
Если строки разной длины:
- Сначала вы должны найти максимальную длину строк, которая станет размером файла
double[] average. - Наконец, используйте двухуровневый вложенный цикл для вычисления значений
average[]. Внешний цикл будет работать до,average.lengthа внутренний цикл будет работать до количества строк. При обработке каждого столбца используйте счетчик (напримерint count), чтобы отслеживать количество добавляемых значенийsum. В конце внутреннего циклаaverage[i] = sum / count.
Демо:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// Test
double[][] nums = { { 10, 15, 20 }, { 1, 2 }, { 5, 10, 15, 25 } };
System.out.println(Arrays.toString(averageColumns(nums)));
}
static double[] averageColumns(double matrix[][]) {
// Find the maximum of the length of rows
int max = matrix[0].length;
for (int i = 0; i < matrix.length; i++) {
if (matrix[i].length > max) {
max = matrix[i].length;
}
}
int i, j;
double[] average = new double[max];
for (i = 0; i < average.length; i++) {
double sum = 0;
int count = 0;
for (j = 0; j < matrix.length; j++) {
if (matrix[j].length - 1 >= i) {
sum += matrix[j][i];
count++;
}
}
average[i] = sum / count;
}
return average;
}
}
Вывод:
[5.333333333333333, 9.0, 17.5, 25.0]