abstract class MatrixUtility in Image Effects 8.3
Same name and namespace in other branches
- 8 src/Component/MatrixUtility.php \Drupal\image_effects\Component\MatrixUtility
- 8.2 src/Component/MatrixUtility.php \Drupal\image_effects\Component\MatrixUtility
Matrix handling methods for image_effects.
Hierarchy
- class \Drupal\image_effects\Component\MatrixUtility
Expanded class hierarchy of MatrixUtility
2 files declare their use of MatrixUtility
- GDOperationTrait.php in src/
Plugin/ ImageToolkit/ Operation/ gd/ GDOperationTrait.php - MatrixUtilityTest.php in tests/
src/ Unit/ MatrixUtilityTest.php
File
- src/
Component/ MatrixUtility.php, line 8
Namespace
Drupal\image_effects\ComponentView source
abstract class MatrixUtility {
/**
* Calculates the cumulative sum matrix of a bi-dimensional matrix.
*
* @param array $matrix
* A simple array of matrix rows values. Each row is a simple array of
* numeric values.
*
* @return array
* A matrix representing the cumulative sum of the input matrix, in the form
* of a simple array of matrix rows values. Each row is a simple array of
* numeric values.
*
* @see https://stackoverflow.com/questions/39937212/maximum-subarray-of-size-hxw-within-a-2d-matrix
*/
public static function cumulativeSum(array $matrix) {
$matrix_rows = count($matrix);
$matrix_columns = count($matrix[0]);
$cumulative_sum_matrix = [];
for ($r = 0; $r < $matrix_rows; $r++) {
for ($c = 0; $c < $matrix_columns; $c++) {
if ($r === 0 && $c === 0) {
$cumulative_sum_matrix[$r][$c] = $matrix[$r][$c];
}
elseif ($r == 0) {
$cumulative_sum_matrix[$r][$c] = $cumulative_sum_matrix[$r][$c - 1] + $matrix[$r][$c];
}
elseif ($c == 0) {
$cumulative_sum_matrix[$r][$c] = $cumulative_sum_matrix[$r - 1][$c] + $matrix[$r][$c];
}
else {
$cumulative_sum_matrix[$r][$c] = $cumulative_sum_matrix[$r - 1][$c] + $cumulative_sum_matrix[$r][$c - 1] - $cumulative_sum_matrix[$r - 1][$c - 1] + $matrix[$r][$c];
}
}
}
return $cumulative_sum_matrix;
}
/**
* Find the sum-matrix of a bi-dimensional matrix having the highest sum.
*
* @param array $matrix
* A simple array of matrix rows values. Each row is a simple array of
* numeric values.
* @param int $rows
* The number of rows of the sub-matrix.
* @param int $columns
* The number of columns of the sub-matrix.
*
* @return array
* A simple array with the following values:
* - the row of the input matrix where the sub-matrix starts;
* - the column of the input matrix where the sub-matrix starts;
* - the value of the sum of the sub-matrix.
*
* @see https://stackoverflow.com/questions/39937212/maximum-subarray-of-size-hxw-within-a-2d-matrix
*/
public static function findMaxSumSubmatrix(array $matrix, $rows, $columns) {
$matrix_rows = count($matrix);
$matrix_columns = count($matrix[0]);
$max_sum = 0;
$max_sum_position = NULL;
for ($r1 = 0; $r1 < $matrix_rows; $r1++) {
for ($c1 = 0; $c1 < $matrix_columns; $c1++) {
$r2 = $r1 + $rows - 1;
$c2 = $c1 + $columns - 1;
if ($r2 >= $matrix_rows || $c2 >= $matrix_columns) {
continue;
}
if ($r1 == 0 && $c1 == 0) {
$sub_sum = $matrix[$r2][$c2];
}
elseif ($r1 == 0) {
$sub_sum = $matrix[$r2][$c2] - $matrix[$r2][$c1 - 1];
}
elseif ($c1 == 0) {
$sub_sum = $matrix[$r2][$c2] - $matrix[$r1 - 1][$c2];
}
else {
$sub_sum = $matrix[$r2][$c2] - $matrix[$r1 - 1][$c2] - $matrix[$r2][$c1 - 1] + $matrix[$r1 - 1][$c1 - 1];
}
if ($max_sum < $sub_sum) {
$max_sum_position = [
$r1,
$c1,
$sub_sum,
];
$max_sum = $sub_sum;
}
}
}
return $max_sum_position;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
MatrixUtility:: |
public static | function | Calculates the cumulative sum matrix of a bi-dimensional matrix. | |
MatrixUtility:: |
public static | function | Find the sum-matrix of a bi-dimensional matrix having the highest sum. |