Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   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)
  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)
  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  }