Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
namespace Matrix\Operators;
4
 
5
use Matrix\Matrix;
6
use Matrix\Exception;
7
 
8
class DirectSum extends Operator
9
{
10
    /**
11
     * Execute the addition
12
     *
13
     * @param mixed $value The matrix or numeric value to add to the current base value
14
     * @return $this The operation object, allowing multiple additions to be chained
15
     * @throws Exception If the provided argument is not appropriate for the operation
16
     */
17
    public function execute($value): Operator
18
    {
19
        if (is_array($value)) {
20
            $value = new Matrix($value);
21
        }
22
 
23
        if ($value instanceof Matrix) {
24
            return $this->directSumMatrix($value);
25
        }
26
 
27
        throw new Exception('Invalid argument for addition');
28
    }
29
 
30
    /**
31
     * Execute the direct sum for a matrix
32
     *
33
     * @param Matrix $value The numeric value to concatenate/direct sum with the current base value
34
     * @return $this The operation object, allowing multiple additions to be chained
35
     **/
36
    private function directSumMatrix($value): Operator
37
    {
38
        $originalColumnCount = count($this->matrix[0]);
39
        $originalRowCount = count($this->matrix);
40
        $valColumnCount = $value->columns;
41
        $valRowCount = $value->rows;
42
        $value = $value->toArray();
43
 
44
        for ($row = 0; $row < $this->rows; ++$row) {
45
            $this->matrix[$row] = array_merge($this->matrix[$row], array_fill(0, $valColumnCount, 0));
46
        }
47
 
48
        $this->matrix = array_merge(
49
            $this->matrix,
50
            array_fill(0, $valRowCount, array_fill(0, $originalColumnCount, 0))
51
        );
52
 
53
        for ($row = $originalRowCount; $row < $originalRowCount + $valRowCount; ++$row) {
54
            array_splice(
55
                $this->matrix[$row],
56
                $originalColumnCount,
57
                $valColumnCount,
58
                $value[$row - $originalRowCount]
59
            );
60
        }
61
 
62
        return $this;
63
    }
64
}