mirror of
https://github.com/TheAlgorithms/Java.git
synced 2026-03-13 08:40:43 +08:00
* Add StochasticMatrix utility class This class provides methods to check if a matrix is row-stochastic or column-stochastic, ensuring all elements are non-negative and the sums of rows or columns equal 1. * Change package from maths to matrix Updated package declaration for StochasticMatrix class. * Change package declaration in StochasticMatrixTest * Delete src/test/java/com/thealgorithms/StochasticMatrixTest.java * Refactor matrix initialization for test cases * Fix formatting of matrix initialization in tests * Remove unnecessary newline in StochasticMatrix * Add import statement for JUnit in StochasticMatrixTest * Add additional assertions to StochasticMatrixTest * Clean up import statements in StochasticMatrixTest Removed unused import statements for cleaner code. * Reorder import statements in StochasticMatrixTest * Remove unused import assertThrows from StochasticMatrixTest Removed unused import for assertThrows.
75 lines
2.1 KiB
Java
75 lines
2.1 KiB
Java
package com.thealgorithms.matrix;
|
|
|
|
/**
|
|
* Utility class to check whether a matrix is stochastic.
|
|
* A matrix is stochastic if all its elements are non-negative
|
|
* and the sum of each row or column is equal to 1.
|
|
*Reference: https://en.wikipedia.org/wiki/Stochastic_matrix
|
|
*/
|
|
public final class StochasticMatrix {
|
|
|
|
private static final double TOLERANCE = 1e-9;
|
|
|
|
private StochasticMatrix() {
|
|
// Utility class
|
|
}
|
|
/**
|
|
* Checks if a matrix is row-stochastic.
|
|
*
|
|
* @param matrix the matrix to check
|
|
* @return true if the matrix is row-stochastic
|
|
* @throws IllegalArgumentException if matrix is null or empty
|
|
*/
|
|
public static boolean isRowStochastic(double[][] matrix) {
|
|
validateMatrix(matrix);
|
|
|
|
for (double[] row : matrix) {
|
|
double sum = 0.0;
|
|
for (double value : row) {
|
|
if (value < 0) {
|
|
return false;
|
|
}
|
|
sum += value;
|
|
}
|
|
if (Math.abs(sum - 1.0) > TOLERANCE) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Checks if a matrix is column-stochastic.
|
|
*
|
|
* @param matrix the matrix to check
|
|
* @return true if the matrix is column-stochastic
|
|
* @throws IllegalArgumentException if matrix is null or empty
|
|
*/
|
|
public static boolean isColumnStochastic(double[][] matrix) {
|
|
validateMatrix(matrix);
|
|
|
|
int rows = matrix.length;
|
|
int cols = matrix[0].length;
|
|
|
|
for (int j = 0; j < cols; j++) {
|
|
double sum = 0.0;
|
|
for (int i = 0; i < rows; i++) {
|
|
if (matrix[i][j] < 0) {
|
|
return false;
|
|
}
|
|
sum += matrix[i][j];
|
|
}
|
|
if (Math.abs(sum - 1.0) > TOLERANCE) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static void validateMatrix(double[][] matrix) {
|
|
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
|
|
throw new IllegalArgumentException("Matrix must not be null or empty");
|
|
}
|
|
}
|
|
}
|