给定两个N×N的矩阵,求乘积
如下图所示,乘法执行过程如下:
1.矩阵1先拿出一行,矩阵2先拿出一列
2.行与列相乘得到value1
3.行与剩下矩阵2相乘得到value2(递归过程)
4.剩下矩阵1与列相乘得到value3(递归过程)
5.剩下矩阵1与剩下矩阵2相乘得到value4(递归过程)
6.将value1~value4合并成结果数组

写代码时注意约定,value1一定是数值,value2、value3、value4是数值、空数组或者非空的二维数组
由php实现,大体思路不难,但是要非常注意合并结果的细节:
1 <?php
2
3 class MatrixProduct
4 {
5 protected $matrix1, $matrix2;
6 protected $result;
7
8 public function __construct($matrix1, $matrix2)
9 {
10 $this->matrix1 = $matrix1;
11 $this->matrix2 = $matrix2;
12 $this->result = $this->matrixProduction($this->matrix1, $this->matrix2);
13 }
14
15 public function show()
16 {
17 foreach ($this->result as $row) {
18 foreach ($row as $data) {
19 printf('%5d', $data);
20 }
21 echo PHP_EOL;
22 }
23 }
24
25 protected function popRow(&$matrix)
26 {
27 return empty($matrix) ? [] : [array_shift($matrix)];
28 }
29
30 protected function popColumn(&$matrix)
31 {
32 $column = [];
33 foreach ($matrix as $key => &$row) {
34 $data = array_shift($row);
35 if (empty($data) || empty($row)) {
36 unset($matrix[$key]);
37 }
38 $column[] = [$data];
39 }
40 return $column;
41 }
42
43 protected function countProduction($row, $column)
44 {
45 for ($i = 0, $sum = 0; $i < count($row[0]); $i++) {
46 $sum += $row[0][$i] * $column[$i][0];
47 }
48 return $sum;
49 }
50
51 protected function merger($value1, $value2, $value3, $value4)
52 {
53 if (empty($value2) && empty($value3)) {
54 return $value1;
55 } else {
56 $array12 = array_merge([$value1], !is_array($value2) ? [$value2] : $value2[0] ?? []);
57 if (!is_array($value3)) {
58 $array34 = array_merge([$value3], !is_array($value4) ? [$value4] : $value4[0] ?? []);
59 return [$array12, $array34];
60 } else {
61 for ($i = 0, $array34 = []; $i < count($value3); $i++) {
62 $array34[] = array_merge($value3[$i], $value4[$i] ?? []);
63 }
64 return array_merge([$array12], $array34);
65 }
66 }
67 }
68
69 protected function matrixProduction($matrix1, $matrix2)
70 {
71 $row = $this->popRow($matrix1);
72 $column = $this->popColumn($matrix2);
73 if (empty($row) || empty($column)) {
74 return [];
75 }
76
77 $value1 = $this->countProduction($row, $column);
78 $value2 = $this->matrixProduction($row, $matrix2);
79 $value3 = $this->matrixProduction($matrix1, $column);
80 $value4 = $this->matrixProduction($matrix1, $matrix2);
81
82 return $this->merger($value1, $value2, $value3, $value4);
83 }
84 }
85
86 $matrix1 = [
87 [1, 2, 3, 4],
88 [1, 2, 3, 4],
89 [1, 2, 3, 4],
90 [1, 2, 3, 4],
91 ];
92
93 $matrix2 = [
94 [1, 2, 3, 4],
95 [5, 6, 7, 8],
96 [9, 10, 11, 12],
97 [13, 14, 15, 16]
98 ];
99
100 $production = new MatrixProduct($matrix1, $matrix2);
101 $production->show();
来源:https://www.cnblogs.com/SHQHDMR/p/11089228.html