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:
Daniel Sánchez Núñez
2025-12-28 10:53:12 +01:00
committed by GitHub
parent 51335cc18a
commit d382e656f2
2 changed files with 102 additions and 0 deletions

View 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");
}
}
}

View File

@@ -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));
}
}