public function kroneckerProduct(Matrix $B) : Matrix
{
// Compute each element of the block matrix
$arrays = [];
for ($m = 0; $m < $this->m; $m++) {
$row = [];
for ($n = 0; $n < $this->n; $n++) {
$R = [];
for ($p = 0; $p < $B->getM(); $p++) {
for ($q = 0; $q < $B->getN(); $q++) {
$R[$p][$q] = $this->A[$m][$n] * $B[$p][$q];
}
}
$row[] = new Matrix($R);
}
$arrays[] = $row;
}
// Augment each aᵢ₁ to aᵢn block
$matrices = [];
foreach ($arrays as $row) {
$initial_matrix = array_shift($row);
$matrices[] = array_reduce($row, function ($augmented_matrix, $matrix) {
return $augmented_matrix->augment($matrix);
}, $initial_matrix);
}
// Augment below each row block a₁ to am
$initial_matrix = array_shift($matrices);
$A⊗B = array_reduce($matrices, function ($augmented_matrix, $matrix) {
return $augmented_matrix->augmentBelow($matrix);
}, $initial_matrix);
return $A⊗B;
}