Wie berechnet man den Durchschnittswert jeder Spalte in einem 2D-Array?
Ich versuche, den Durchschnittswert von Spalten in einem 2D-Array zu berechnen, kann den Code jedoch nicht ermitteln. Die Funktion sollte den Durchschnittswert jeder Spalte zurückgeben. Und ich kann das Ergebnis nicht in der Funktion drucken. Der Druck sollte in der Hauptfunktion sein.
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;
}
Antworten
So können Sie die Summe und die Durchschnittswerte jeder Zeile und Spalte berechnen: Der folgende Beispielcode druckt die Summe und die Durchschnittswerte auf dieselbe Weise und gibt keinen Wert zurück. Wenn Sie die tatsächliche Summe und den Durchschnitt zurückgeben müssen, müssen Sie double [] zurückgeben, das alle Summen oder Durchschnittswerte anstelle eines Double enthält.
CODE
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;
}
}
}
AUSGABE
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
Wenn Sie eine NxN
Matrix annehmen , können Sie mit Streams lösen:
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());
oder besser lesbar
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());
Sie transponieren die Matrix und Arrays.stream(...).average().getAsDouble()
berechnen dann die Durchschnittswerte der Arrays.
- Sie müssen a
double[]
anstelle von adouble
von der Funktion zurückgeben. - Da die Zahlen vom Typ sind
double
, sollte der Typsum
seindouble
.
Wenn alle Zeilen gleich lang sind:
- Da Sie die Werte jeder Spalte hinzufügen möchten, sollten Sie
matrix[j][i]
(anstelle vonmatrix[i][j]
) hinzufügensum
und dies entsprechendaverage[i]
tunsum / matrix.length
.
Demo:
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;
}
}
Ausgabe:
[5.333333333333333, 9.0, 12.666666666666666]
Wenn die Zeilen unterschiedlich lang sind:
- Sie sollten zuerst das Maximum der Zeilenlänge ermitteln, die der Größe der Zeile entspricht
double[] average
. - Verwenden Sie abschließend eine verschachtelte Schleife mit zwei Ebenen, um die Werte für zu berechnen
average[]
. Die äußere Schleife läuft bis zuaverage.length
und die innere Schleife läuft bis zur Anzahl der Zeilen. Verwenden Sie während der Verarbeitung jeder Spalte einen Zähler (z. B.int count
), um die Anzahl der hinzugefügten Werte zu verfolgensum
. Am Ende der inneren Schleifeaverage[i] = sum / count
.
Demo:
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;
}
}
Ausgabe:
[5.333333333333333, 9.0, 17.5, 25.0]