Multidimensional array multiplication

2019-03-06 21:01发布

问题:

Suppose I want a code in PHP that replicates matrix multiplication, where my matrices look like:

$matrix_1 = array(array(1,2), array(3,4))

The number of subarrays (2) is equivalent to the number of columns in the matrix, whereas the number of elements in each subarray (2) represents the number of rows in the matrix.

The code would need to:

  • Account for matrices of different dimensions.
  • Recognise when two matrices cannot be multipled (where the number of columns in matrix A is not the same as the number of rows in matrix B).
  • Possibly account for scalar multiplication, where each element of a matrix is multiplied by a constant.

I have attached slides here that explain what the code should achieve (with two examples).

回答1:

Here's my (long-winded) solution. I'm going to try to see if I can simplify this in places. Note that:

  • This solution does not account for scalar multiplication, but this is relatively easy to incorporate if you wanted to include it. Assume a scalar is a one-element array - in which case, in the else command simply include a count() command to recognise if one (or more) of arrays is a scalar and apply a multiplication function accordingly using array_map.
  • I am assuming that the arrays follow matrix form - e.g. one column cannot have more elements than another. You can account for this formally by making sure each subarray has the same number of elements.

The code:

<?php

// FUNCTIONS

function mul($x, $y){
    return ($x * $y);
}

// Example Arrays

$array_1 = array(array(1,4,7), array(2,5,8), array(3,6,9));
$array_2 = array(array(7,6,4), array(5,8,1), array(4,3,2));

// Check for row/column equivalence

$array_1_cols = count($array_1);
$array_1_rows = count($array_1[0]);
$array_2_cols = count($array_2);
$array_2_rows = count($array_2[0]);

// Check to see if matrix multiplication is possible

if($array_1_cols == $array_2_rows) {

$m_cols = $array_2_cols;
$m_rows = $array_1_rows;

$array_3 = array();
$col_index = 1;

// Start loop for each column of the new matrix

while($col_index <= $m_cols) {
$m_col_index = $col_index - 1;
$sub_array[$col_index] = array();

// Start loop for each row of the new matrix

$row_index = 1;
while($row_index <= $m_rows) {
$m_row_index = $row_index - 1;

// Auxiliary array for each row of A
$a_row[$row_index] = array();

$a_index = 1;
while($a_index <= $array_1_cols) {
$start_p = $a_index - 1;
$el_part_[$a_index] = $array_1[$start_p];
$el_part_[$a_index] = $el_part_[$a_index][$m_row_index];
array_push($a_row[$row_index], $el_part_[$a_index]);
++$a_index;
}

// Array for columns of B

$b_col[$col_index] = $array_2[$m_col_index];

// Build matrix C - defined over the rows of A and the columns of B

$c_part[$row_index][$col_index] = array_map('mul', $a_row[$row_index], $b_col[$col_index]);

$c_el[$row_index][$col_index] = array_sum($c_part[$row_index][$col_index]);

array_push($sub_array[$col_index], $c_el[$row_index][$col_index]);

// End row loop

++$row_index;
}

array_push($array_3,$sub_array[$col_index]);

++$col_index;
}

print_r($array_3);

} else {

echo "This is not possible!";

}


?>