mirror of
https://github.com/TheAlgorithms/Java.git
synced 2026-03-13 08:40:43 +08:00
Adding method to check wether a matrix is stochastic (#7184)
* 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.
This commit is contained in:
committed by
GitHub
parent
51335cc18a
commit
d382e656f2
74
src/main/java/com/thealgorithms/matrix/StochasticMatrix.java
Normal file
74
src/main/java/com/thealgorithms/matrix/StochasticMatrix.java
Normal file
@@ -0,0 +1,74 @@
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.thealgorithms.matrix;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class StochasticMatrixTest {
|
||||
|
||||
@Test
|
||||
void testRowStochasticMatrix() {
|
||||
double[][] matrix = {{0.2, 0.5, 0.3}, {0.1, 0.6, 0.3}};
|
||||
assertTrue(StochasticMatrix.isRowStochastic(matrix));
|
||||
assertFalse(StochasticMatrix.isColumnStochastic(matrix));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testColumnStochasticMatrix() {
|
||||
double[][] matrix = {{0.4, 0.2}, {0.6, 0.8}};
|
||||
assertTrue(StochasticMatrix.isColumnStochastic(matrix));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInvalidMatrix() {
|
||||
double[][] matrix = {{0.5, -0.5}, {0.5, 1.5}};
|
||||
assertFalse(StochasticMatrix.isRowStochastic(matrix));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user