Intereting Posts
Преобразование армейского времени в основное время AM PM в PHP В чем разница между строками с одним кавычком и двойными кавычками в PHP? Как вызвать службу веб-сайта из PHP? Печать данных базы данных в таблице html Продолжайте получать «Ежедневный лимит неисполненного использования превышен. Продолжение использования требует регистрации "при попытке Google плюс вход в мое веб-приложение Список всех файлов в одном каталоге PHP Не удается создать php str_replace (), чтобы удалить запятую Неустранимая ошибка: класс 'IntlDateFormatter' не найден Обрезаемая фатальная ошибка: объект класса __PHP_Incomplete_Class Неопределенное смещение 1, массив в php Echo 'string', в то время как каждая итерация длинного цикла (flush () не работает) серверная сторона AdSense Почему пересчет составляет 2 не 1? Ошибка PHPExcel в CodeIgniter «Не удалось загрузить запрошенный класс: iofactory» Функция дополнительного параметра функции jQuery Knob

Многомерное умножение массива

Предположим, что мне нужен код на PHP, который реплицирует матричное умножение, где мои матрицы выглядят так:

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

Количество подмассивов ( 2 ) эквивалентно количеству столбцов в матрице, тогда как число элементов в каждом подмассиве ( 2 ) представляет количество строк в матрице.

Код должен будет:

  • Учет для матриц разных размеров.
  • Признать, когда две матрицы не могут быть умножены (где число столбцов в матрице A не совпадает с числом строк в матрице B).
  • Возможно, скажем, скалярное умножение, где каждый элемент матрицы умножается на константу.

Здесь я приложил слайды, которые объясняют, что должен делать код (с двумя примерами).

Вот мое (длинное) решение. Я попытаюсь посмотреть, могу ли я упростить это в местах. Обратите внимание, что:

  • Это решение не учитывает скалярное умножение, но это относительно легко включить, если вы хотите его включить. Предположим, что скаляр является одноэлементным массивом – в этом случае команда else просто включает команду count() чтобы распознать, является ли один (или несколько) массивов скалярным, и соответственно применить функцию умножения с помощью array_map .
  • Я предполагаю, что массивы следуют матричной форме – например, один столбец не может иметь больше элементов, чем другой. Вы можете объяснить это формально, убедившись, что каждый подмассив имеет одинаковое количество элементов.

Код:

 <?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!"; } ?>