[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/phpexcel/PHPExcel/Shared/JAMA/ -> Matrix.php (source)

   1  <?php
   2  /**
   3   * @package JAMA
   4   */
   5  
   6  /** PHPExcel root directory */
   7  if (!defined('PHPEXCEL_ROOT')) {
   8      /**
   9       * @ignore
  10       */
  11      define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../../');
  12      require (PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
  13  }
  14  
  15  
  16  /*
  17   *    Matrix class
  18   *
  19   *    @author Paul Meagher
  20   *    @author Michael Bommarito
  21   *    @author Lukasz Karapuda
  22   *    @author Bartek Matosiuk
  23   *    @version 1.8
  24   *    @license PHP v3.0
  25   *    @see http://math.nist.gov/javanumerics/jama/
  26   */
  27  class PHPExcel_Shared_JAMA_Matrix {
  28  
  29  
  30      const PolymorphicArgumentException    = "Invalid argument pattern for polymorphic function.";
  31      const ArgumentTypeException            = "Invalid argument type.";
  32      const ArgumentBoundsException        = "Invalid argument range.";
  33      const MatrixDimensionException        = "Matrix dimensions are not equal.";
  34      const ArrayLengthException            = "Array length must be a multiple of m.";
  35  
  36      /**
  37       *    Matrix storage
  38       *
  39       *    @var array
  40       *    @access public
  41       */
  42      public $A = array();
  43  
  44      /**
  45       *    Matrix row dimension
  46       *
  47       *    @var int
  48       *    @access private
  49       */
  50      private $m;
  51  
  52      /**
  53       *    Matrix column dimension
  54       *
  55       *    @var int
  56       *    @access private
  57       */
  58      private $n;
  59  
  60  
  61      /**
  62       *    Polymorphic constructor
  63       *
  64       *    As PHP has no support for polymorphic constructors, we hack our own sort of polymorphism using func_num_args, func_get_arg, and gettype. In essence, we're just implementing a simple RTTI filter and calling the appropriate constructor.
  65       */
  66  	public function __construct() {
  67          if (func_num_args() > 0) {
  68              $args = func_get_args();
  69              $match = implode(",", array_map('gettype', $args));
  70  
  71              switch($match) {
  72                  //Rectangular matrix - m x n initialized from 2D array
  73                  case 'array':
  74                          $this->m = count($args[0]);
  75                          $this->n = count($args[0][0]);
  76                          $this->A = $args[0];
  77                          break;
  78                  //Square matrix - n x n
  79                  case 'integer':
  80                          $this->m = $args[0];
  81                          $this->n = $args[0];
  82                          $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));
  83                          break;
  84                  //Rectangular matrix - m x n
  85                  case 'integer,integer':
  86                          $this->m = $args[0];
  87                          $this->n = $args[1];
  88                          $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));
  89                          break;
  90                  //Rectangular matrix - m x n initialized from packed array
  91                  case 'array,integer':
  92                          $this->m = $args[1];
  93                          if ($this->m != 0) {
  94                              $this->n = count($args[0]) / $this->m;
  95                          } else {
  96                              $this->n = 0;
  97                          }
  98                          if (($this->m * $this->n) == count($args[0])) {
  99                              for($i = 0; $i < $this->m; ++$i) {
 100                                  for($j = 0; $j < $this->n; ++$j) {
 101                                      $this->A[$i][$j] = $args[0][$i + $j * $this->m];
 102                                  }
 103                              }
 104                          } else {
 105                              throw new PHPExcel_Calculation_Exception(self::ArrayLengthException);
 106                          }
 107                          break;
 108                  default:
 109                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 110                          break;
 111              }
 112          } else {
 113              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 114          }
 115      }    //    function __construct()
 116  
 117  
 118      /**
 119       *    getArray
 120       *
 121       *    @return array Matrix array
 122       */
 123  	public function getArray() {
 124          return $this->A;
 125      }    //    function getArray()
 126  
 127  
 128      /**
 129       *    getRowDimension
 130       *
 131       *    @return int Row dimension
 132       */
 133  	public function getRowDimension() {
 134          return $this->m;
 135      }    //    function getRowDimension()
 136  
 137  
 138      /**
 139       *    getColumnDimension
 140       *
 141       *    @return int Column dimension
 142       */
 143  	public function getColumnDimension() {
 144          return $this->n;
 145      }    //    function getColumnDimension()
 146  
 147  
 148      /**
 149       *    get
 150       *
 151       *    Get the i,j-th element of the matrix.
 152       *    @param int $i Row position
 153       *    @param int $j Column position
 154       *    @return mixed Element (int/float/double)
 155       */
 156  	public function get($i = null, $j = null) {
 157          return $this->A[$i][$j];
 158      }    //    function get()
 159  
 160  
 161      /**
 162       *    getMatrix
 163       *
 164       *    Get a submatrix
 165       *    @param int $i0 Initial row index
 166       *    @param int $iF Final row index
 167       *    @param int $j0 Initial column index
 168       *    @param int $jF Final column index
 169       *    @return Matrix Submatrix
 170       */
 171  	public function getMatrix() {
 172          if (func_num_args() > 0) {
 173              $args = func_get_args();
 174              $match = implode(",", array_map('gettype', $args));
 175  
 176              switch($match) {
 177                  //A($i0...; $j0...)
 178                  case 'integer,integer':
 179                          list($i0, $j0) = $args;
 180                          if ($i0 >= 0) { $m = $this->m - $i0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 181                          if ($j0 >= 0) { $n = $this->n - $j0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 182                          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);
 183                          for($i = $i0; $i < $this->m; ++$i) {
 184                              for($j = $j0; $j < $this->n; ++$j) {
 185                                  $R->set($i, $j, $this->A[$i][$j]);
 186                              }
 187                          }
 188                          return $R;
 189                          break;
 190                  //A($i0...$iF; $j0...$jF)
 191                  case 'integer,integer,integer,integer':
 192                          list($i0, $iF, $j0, $jF) = $args;
 193                          if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { $m = $iF - $i0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 194                          if (($jF > $j0) && ($this->n >= $jF) && ($j0 >= 0)) { $n = $jF - $j0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 195                          $R = new PHPExcel_Shared_JAMA_Matrix($m+1, $n+1);
 196                          for($i = $i0; $i <= $iF; ++$i) {
 197                              for($j = $j0; $j <= $jF; ++$j) {
 198                                  $R->set($i - $i0, $j - $j0, $this->A[$i][$j]);
 199                              }
 200                          }
 201                          return $R;
 202                          break;
 203                  //$R = array of row indices; $C = array of column indices
 204                  case 'array,array':
 205                          list($RL, $CL) = $args;
 206                          if (count($RL) > 0) { $m = count($RL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 207                          if (count($CL) > 0) { $n = count($CL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 208                          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);
 209                          for($i = 0; $i < $m; ++$i) {
 210                              for($j = 0; $j < $n; ++$j) {
 211                                  $R->set($i - $i0, $j - $j0, $this->A[$RL[$i]][$CL[$j]]);
 212                              }
 213                          }
 214                          return $R;
 215                          break;
 216                  //$RL = array of row indices; $CL = array of column indices
 217                  case 'array,array':
 218                          list($RL, $CL) = $args;
 219                          if (count($RL) > 0) { $m = count($RL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 220                          if (count($CL) > 0) { $n = count($CL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 221                          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);
 222                          for($i = 0; $i < $m; ++$i) {
 223                              for($j = 0; $j < $n; ++$j) {
 224                                  $R->set($i, $j, $this->A[$RL[$i]][$CL[$j]]);
 225                              }
 226                          }
 227                          return $R;
 228                          break;
 229                  //A($i0...$iF); $CL = array of column indices
 230                  case 'integer,integer,array':
 231                          list($i0, $iF, $CL) = $args;
 232                          if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { $m = $iF - $i0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 233                          if (count($CL) > 0) { $n = count($CL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 234                          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);
 235                          for($i = $i0; $i < $iF; ++$i) {
 236                              for($j = 0; $j < $n; ++$j) {
 237                                  $R->set($i - $i0, $j, $this->A[$RL[$i]][$j]);
 238                              }
 239                          }
 240                          return $R;
 241                          break;
 242                  //$RL = array of row indices
 243                  case 'array,integer,integer':
 244                          list($RL, $j0, $jF) = $args;
 245                          if (count($RL) > 0) { $m = count($RL); } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 246                          if (($jF >= $j0) && ($this->n >= $jF) && ($j0 >= 0)) { $n = $jF - $j0; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentBoundsException); }
 247                          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n+1);
 248                          for($i = 0; $i < $m; ++$i) {
 249                              for($j = $j0; $j <= $jF; ++$j) {
 250                                  $R->set($i, $j - $j0, $this->A[$RL[$i]][$j]);
 251                              }
 252                          }
 253                          return $R;
 254                          break;
 255                  default:
 256                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 257                          break;
 258              }
 259          } else {
 260              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 261          }
 262      }    //    function getMatrix()
 263  
 264  
 265      /**
 266       *    checkMatrixDimensions
 267       *
 268       *    Is matrix B the same size?
 269       *    @param Matrix $B Matrix B
 270       *    @return boolean
 271       */
 272  	public function checkMatrixDimensions($B = null) {
 273          if ($B instanceof PHPExcel_Shared_JAMA_Matrix) {
 274              if (($this->m == $B->getRowDimension()) && ($this->n == $B->getColumnDimension())) {
 275                  return true;
 276              } else {
 277                  throw new PHPExcel_Calculation_Exception(self::MatrixDimensionException);
 278              }
 279          } else {
 280              throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException);
 281          }
 282      }    //    function checkMatrixDimensions()
 283  
 284  
 285  
 286      /**
 287       *    set
 288       *
 289       *    Set the i,j-th element of the matrix.
 290       *    @param int $i Row position
 291       *    @param int $j Column position
 292       *    @param mixed $c Int/float/double value
 293       *    @return mixed Element (int/float/double)
 294       */
 295  	public function set($i = null, $j = null, $c = null) {
 296          // Optimized set version just has this
 297          $this->A[$i][$j] = $c;
 298      }    //    function set()
 299  
 300  
 301      /**
 302       *    identity
 303       *
 304       *    Generate an identity matrix.
 305       *    @param int $m Row dimension
 306       *    @param int $n Column dimension
 307       *    @return Matrix Identity matrix
 308       */
 309  	public function identity($m = null, $n = null) {
 310          return $this->diagonal($m, $n, 1);
 311      }    //    function identity()
 312  
 313  
 314      /**
 315       *    diagonal
 316       *
 317       *    Generate a diagonal matrix
 318       *    @param int $m Row dimension
 319       *    @param int $n Column dimension
 320       *    @param mixed $c Diagonal value
 321       *    @return Matrix Diagonal matrix
 322       */
 323  	public function diagonal($m = null, $n = null, $c = 1) {
 324          $R = new PHPExcel_Shared_JAMA_Matrix($m, $n);
 325          for($i = 0; $i < $m; ++$i) {
 326              $R->set($i, $i, $c);
 327          }
 328          return $R;
 329      }    //    function diagonal()
 330  
 331  
 332      /**
 333       *    getMatrixByRow
 334       *
 335       *    Get a submatrix by row index/range
 336       *    @param int $i0 Initial row index
 337       *    @param int $iF Final row index
 338       *    @return Matrix Submatrix
 339       */
 340  	public function getMatrixByRow($i0 = null, $iF = null) {
 341          if (is_int($i0)) {
 342              if (is_int($iF)) {
 343                  return $this->getMatrix($i0, 0, $iF + 1, $this->n);
 344              } else {
 345                  return $this->getMatrix($i0, 0, $i0 + 1, $this->n);
 346              }
 347          } else {
 348              throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException);
 349          }
 350      }    //    function getMatrixByRow()
 351  
 352  
 353      /**
 354       *    getMatrixByCol
 355       *
 356       *    Get a submatrix by column index/range
 357       *    @param int $i0 Initial column index
 358       *    @param int $iF Final column index
 359       *    @return Matrix Submatrix
 360       */
 361  	public function getMatrixByCol($j0 = null, $jF = null) {
 362          if (is_int($j0)) {
 363              if (is_int($jF)) {
 364                  return $this->getMatrix(0, $j0, $this->m, $jF + 1);
 365              } else {
 366                  return $this->getMatrix(0, $j0, $this->m, $j0 + 1);
 367              }
 368          } else {
 369              throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException);
 370          }
 371      }    //    function getMatrixByCol()
 372  
 373  
 374      /**
 375       *    transpose
 376       *
 377       *    Tranpose matrix
 378       *    @return Matrix Transposed matrix
 379       */
 380  	public function transpose() {
 381          $R = new PHPExcel_Shared_JAMA_Matrix($this->n, $this->m);
 382          for($i = 0; $i < $this->m; ++$i) {
 383              for($j = 0; $j < $this->n; ++$j) {
 384                  $R->set($j, $i, $this->A[$i][$j]);
 385              }
 386          }
 387          return $R;
 388      }    //    function transpose()
 389  
 390  
 391      /**
 392       *    trace
 393       *
 394       *    Sum of diagonal elements
 395       *    @return float Sum of diagonal elements
 396       */
 397  	public function trace() {
 398          $s = 0;
 399          $n = min($this->m, $this->n);
 400          for($i = 0; $i < $n; ++$i) {
 401              $s += $this->A[$i][$i];
 402          }
 403          return $s;
 404      }    //    function trace()
 405  
 406  
 407      /**
 408       *    uminus
 409       *
 410       *    Unary minus matrix -A
 411       *    @return Matrix Unary minus matrix
 412       */
 413  	public function uminus() {
 414      }    //    function uminus()
 415  
 416  
 417      /**
 418       *    plus
 419       *
 420       *    A + B
 421       *    @param mixed $B Matrix/Array
 422       *    @return Matrix Sum
 423       */
 424  	public function plus() {
 425          if (func_num_args() > 0) {
 426              $args = func_get_args();
 427              $match = implode(",", array_map('gettype', $args));
 428  
 429              switch($match) {
 430                  case 'object':
 431                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 432                          break;
 433                  case 'array':
 434                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 435                          break;
 436                  default:
 437                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 438                          break;
 439              }
 440              $this->checkMatrixDimensions($M);
 441              for($i = 0; $i < $this->m; ++$i) {
 442                  for($j = 0; $j < $this->n; ++$j) {
 443                      $M->set($i, $j, $M->get($i, $j) + $this->A[$i][$j]);
 444                  }
 445              }
 446              return $M;
 447          } else {
 448              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 449          }
 450      }    //    function plus()
 451  
 452  
 453      /**
 454       *    plusEquals
 455       *
 456       *    A = A + B
 457       *    @param mixed $B Matrix/Array
 458       *    @return Matrix Sum
 459       */
 460  	public function plusEquals() {
 461          if (func_num_args() > 0) {
 462              $args = func_get_args();
 463              $match = implode(",", array_map('gettype', $args));
 464  
 465              switch($match) {
 466                  case 'object':
 467                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 468                          break;
 469                  case 'array':
 470                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 471                          break;
 472                  default:
 473                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 474                          break;
 475              }
 476              $this->checkMatrixDimensions($M);
 477              for($i = 0; $i < $this->m; ++$i) {
 478                  for($j = 0; $j < $this->n; ++$j) {
 479                      $validValues = True;
 480                      $value = $M->get($i, $j);
 481                      if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
 482                          $this->A[$i][$j] = trim($this->A[$i][$j],'"');
 483                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);
 484                      }
 485                      if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
 486                          $value = trim($value,'"');
 487                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);
 488                      }
 489                      if ($validValues) {
 490                          $this->A[$i][$j] += $value;
 491                      } else {
 492                          $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();
 493                      }
 494                  }
 495              }
 496              return $this;
 497          } else {
 498              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 499          }
 500      }    //    function plusEquals()
 501  
 502  
 503      /**
 504       *    minus
 505       *
 506       *    A - B
 507       *    @param mixed $B Matrix/Array
 508       *    @return Matrix Sum
 509       */
 510  	public function minus() {
 511          if (func_num_args() > 0) {
 512              $args = func_get_args();
 513              $match = implode(",", array_map('gettype', $args));
 514  
 515              switch($match) {
 516                  case 'object':
 517                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 518                          break;
 519                  case 'array':
 520                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 521                          break;
 522                  default:
 523                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 524                          break;
 525              }
 526              $this->checkMatrixDimensions($M);
 527              for($i = 0; $i < $this->m; ++$i) {
 528                  for($j = 0; $j < $this->n; ++$j) {
 529                      $M->set($i, $j, $M->get($i, $j) - $this->A[$i][$j]);
 530                  }
 531              }
 532              return $M;
 533          } else {
 534              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 535          }
 536      }    //    function minus()
 537  
 538  
 539      /**
 540       *    minusEquals
 541       *
 542       *    A = A - B
 543       *    @param mixed $B Matrix/Array
 544       *    @return Matrix Sum
 545       */
 546  	public function minusEquals() {
 547          if (func_num_args() > 0) {
 548              $args = func_get_args();
 549              $match = implode(",", array_map('gettype', $args));
 550  
 551              switch($match) {
 552                  case 'object':
 553                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 554                          break;
 555                  case 'array':
 556                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 557                          break;
 558                  default:
 559                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 560                          break;
 561              }
 562              $this->checkMatrixDimensions($M);
 563              for($i = 0; $i < $this->m; ++$i) {
 564                  for($j = 0; $j < $this->n; ++$j) {
 565                      $validValues = True;
 566                      $value = $M->get($i, $j);
 567                      if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
 568                          $this->A[$i][$j] = trim($this->A[$i][$j],'"');
 569                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);
 570                      }
 571                      if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
 572                          $value = trim($value,'"');
 573                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);
 574                      }
 575                      if ($validValues) {
 576                          $this->A[$i][$j] -= $value;
 577                      } else {
 578                          $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();
 579                      }
 580                  }
 581              }
 582              return $this;
 583          } else {
 584              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 585          }
 586      }    //    function minusEquals()
 587  
 588  
 589      /**
 590       *    arrayTimes
 591       *
 592       *    Element-by-element multiplication
 593       *    Cij = Aij * Bij
 594       *    @param mixed $B Matrix/Array
 595       *    @return Matrix Matrix Cij
 596       */
 597  	public function arrayTimes() {
 598          if (func_num_args() > 0) {
 599              $args = func_get_args();
 600              $match = implode(",", array_map('gettype', $args));
 601  
 602              switch($match) {
 603                  case 'object':
 604                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 605                          break;
 606                  case 'array':
 607                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 608                          break;
 609                  default:
 610                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 611                          break;
 612              }
 613              $this->checkMatrixDimensions($M);
 614              for($i = 0; $i < $this->m; ++$i) {
 615                  for($j = 0; $j < $this->n; ++$j) {
 616                      $M->set($i, $j, $M->get($i, $j) * $this->A[$i][$j]);
 617                  }
 618              }
 619              return $M;
 620          } else {
 621              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 622          }
 623      }    //    function arrayTimes()
 624  
 625  
 626      /**
 627       *    arrayTimesEquals
 628       *
 629       *    Element-by-element multiplication
 630       *    Aij = Aij * Bij
 631       *    @param mixed $B Matrix/Array
 632       *    @return Matrix Matrix Aij
 633       */
 634  	public function arrayTimesEquals() {
 635          if (func_num_args() > 0) {
 636              $args = func_get_args();
 637              $match = implode(",", array_map('gettype', $args));
 638  
 639              switch($match) {
 640                  case 'object':
 641                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 642                          break;
 643                  case 'array':
 644                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 645                          break;
 646                  default:
 647                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 648                          break;
 649              }
 650              $this->checkMatrixDimensions($M);
 651              for($i = 0; $i < $this->m; ++$i) {
 652                  for($j = 0; $j < $this->n; ++$j) {
 653                      $validValues = True;
 654                      $value = $M->get($i, $j);
 655                      if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
 656                          $this->A[$i][$j] = trim($this->A[$i][$j],'"');
 657                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);
 658                      }
 659                      if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
 660                          $value = trim($value,'"');
 661                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);
 662                      }
 663                      if ($validValues) {
 664                          $this->A[$i][$j] *= $value;
 665                      } else {
 666                          $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();
 667                      }
 668                  }
 669              }
 670              return $this;
 671          } else {
 672              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 673          }
 674      }    //    function arrayTimesEquals()
 675  
 676  
 677      /**
 678       *    arrayRightDivide
 679       *
 680       *    Element-by-element right division
 681       *    A / B
 682       *    @param Matrix $B Matrix B
 683       *    @return Matrix Division result
 684       */
 685  	public function arrayRightDivide() {
 686          if (func_num_args() > 0) {
 687              $args = func_get_args();
 688              $match = implode(",", array_map('gettype', $args));
 689  
 690              switch($match) {
 691                  case 'object':
 692                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 693                          break;
 694                  case 'array':
 695                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 696                          break;
 697                  default:
 698                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 699                          break;
 700              }
 701              $this->checkMatrixDimensions($M);
 702              for($i = 0; $i < $this->m; ++$i) {
 703                  for($j = 0; $j < $this->n; ++$j) {
 704                      $validValues = True;
 705                      $value = $M->get($i, $j);
 706                      if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
 707                          $this->A[$i][$j] = trim($this->A[$i][$j],'"');
 708                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);
 709                      }
 710                      if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
 711                          $value = trim($value,'"');
 712                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);
 713                      }
 714                      if ($validValues) {
 715                          if ($value == 0) {
 716                              //    Trap for Divide by Zero error
 717                              $M->set($i, $j, '#DIV/0!');
 718                          } else {
 719                              $M->set($i, $j, $this->A[$i][$j] / $value);
 720                          }
 721                      } else {
 722                          $M->set($i, $j, PHPExcel_Calculation_Functions::NaN());
 723                      }
 724                  }
 725              }
 726              return $M;
 727          } else {
 728              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 729          }
 730      }    //    function arrayRightDivide()
 731  
 732  
 733      /**
 734       *    arrayRightDivideEquals
 735       *
 736       *    Element-by-element right division
 737       *    Aij = Aij / Bij
 738       *    @param mixed $B Matrix/Array
 739       *    @return Matrix Matrix Aij
 740       */
 741  	public function arrayRightDivideEquals() {
 742          if (func_num_args() > 0) {
 743              $args = func_get_args();
 744              $match = implode(",", array_map('gettype', $args));
 745  
 746              switch($match) {
 747                  case 'object':
 748                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 749                          break;
 750                  case 'array':
 751                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 752                          break;
 753                  default:
 754                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 755                          break;
 756              }
 757              $this->checkMatrixDimensions($M);
 758              for($i = 0; $i < $this->m; ++$i) {
 759                  for($j = 0; $j < $this->n; ++$j) {
 760                      $this->A[$i][$j] = $this->A[$i][$j] / $M->get($i, $j);
 761                  }
 762              }
 763              return $M;
 764          } else {
 765              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 766          }
 767      }    //    function arrayRightDivideEquals()
 768  
 769  
 770      /**
 771       *    arrayLeftDivide
 772       *
 773       *    Element-by-element Left division
 774       *    A / B
 775       *    @param Matrix $B Matrix B
 776       *    @return Matrix Division result
 777       */
 778  	public function arrayLeftDivide() {
 779          if (func_num_args() > 0) {
 780              $args = func_get_args();
 781              $match = implode(",", array_map('gettype', $args));
 782  
 783              switch($match) {
 784                  case 'object':
 785                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 786                          break;
 787                  case 'array':
 788                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 789                          break;
 790                  default:
 791                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 792                          break;
 793              }
 794              $this->checkMatrixDimensions($M);
 795              for($i = 0; $i < $this->m; ++$i) {
 796                  for($j = 0; $j < $this->n; ++$j) {
 797                      $M->set($i, $j, $M->get($i, $j) / $this->A[$i][$j]);
 798                  }
 799              }
 800              return $M;
 801          } else {
 802              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 803          }
 804      }    //    function arrayLeftDivide()
 805  
 806  
 807      /**
 808       *    arrayLeftDivideEquals
 809       *
 810       *    Element-by-element Left division
 811       *    Aij = Aij / Bij
 812       *    @param mixed $B Matrix/Array
 813       *    @return Matrix Matrix Aij
 814       */
 815  	public function arrayLeftDivideEquals() {
 816          if (func_num_args() > 0) {
 817              $args = func_get_args();
 818              $match = implode(",", array_map('gettype', $args));
 819  
 820              switch($match) {
 821                  case 'object':
 822                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 823                          break;
 824                  case 'array':
 825                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 826                          break;
 827                  default:
 828                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 829                          break;
 830              }
 831              $this->checkMatrixDimensions($M);
 832              for($i = 0; $i < $this->m; ++$i) {
 833                  for($j = 0; $j < $this->n; ++$j) {
 834                      $this->A[$i][$j] = $M->get($i, $j) / $this->A[$i][$j];
 835                  }
 836              }
 837              return $M;
 838          } else {
 839              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 840          }
 841      }    //    function arrayLeftDivideEquals()
 842  
 843  
 844      /**
 845       *    times
 846       *
 847       *    Matrix multiplication
 848       *    @param mixed $n Matrix/Array/Scalar
 849       *    @return Matrix Product
 850       */
 851  	public function times() {
 852          if (func_num_args() > 0) {
 853              $args  = func_get_args();
 854              $match = implode(",", array_map('gettype', $args));
 855  
 856              switch($match) {
 857                  case 'object':
 858                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $B = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 859                          if ($this->n == $B->m) {
 860                              $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n);
 861                              for($j = 0; $j < $B->n; ++$j) {
 862                                  for ($k = 0; $k < $this->n; ++$k) {
 863                                      $Bcolj[$k] = $B->A[$k][$j];
 864                                  }
 865                                  for($i = 0; $i < $this->m; ++$i) {
 866                                      $Arowi = $this->A[$i];
 867                                      $s = 0;
 868                                      for($k = 0; $k < $this->n; ++$k) {
 869                                          $s += $Arowi[$k] * $Bcolj[$k];
 870                                      }
 871                                      $C->A[$i][$j] = $s;
 872                                  }
 873                              }
 874                              return $C;
 875                          } else {
 876                              throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch));
 877                          }
 878                          break;
 879                  case 'array':
 880                          $B = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 881                          if ($this->n == $B->m) {
 882                              $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n);
 883                              for($i = 0; $i < $C->m; ++$i) {
 884                                  for($j = 0; $j < $C->n; ++$j) {
 885                                      $s = "0";
 886                                      for($k = 0; $k < $C->n; ++$k) {
 887                                          $s += $this->A[$i][$k] * $B->A[$k][$j];
 888                                      }
 889                                      $C->A[$i][$j] = $s;
 890                                  }
 891                              }
 892                              return $C;
 893                          } else {
 894                              throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch));
 895                          }
 896                          return $M;
 897                          break;
 898                  case 'integer':
 899                          $C = new PHPExcel_Shared_JAMA_Matrix($this->A);
 900                          for($i = 0; $i < $C->m; ++$i) {
 901                              for($j = 0; $j < $C->n; ++$j) {
 902                                  $C->A[$i][$j] *= $args[0];
 903                              }
 904                          }
 905                          return $C;
 906                          break;
 907                  case 'double':
 908                          $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $this->n);
 909                          for($i = 0; $i < $C->m; ++$i) {
 910                              for($j = 0; $j < $C->n; ++$j) {
 911                                  $C->A[$i][$j] = $args[0] * $this->A[$i][$j];
 912                              }
 913                          }
 914                          return $C;
 915                          break;
 916                  case 'float':
 917                          $C = new PHPExcel_Shared_JAMA_Matrix($this->A);
 918                          for($i = 0; $i < $C->m; ++$i) {
 919                              for($j = 0; $j < $C->n; ++$j) {
 920                                  $C->A[$i][$j] *= $args[0];
 921                              }
 922                          }
 923                          return $C;
 924                          break;
 925                  default:
 926                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 927                          break;
 928              }
 929          } else {
 930              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 931          }
 932      }    //    function times()
 933  
 934  
 935      /**
 936       *    power
 937       *
 938       *    A = A ^ B
 939       *    @param mixed $B Matrix/Array
 940       *    @return Matrix Sum
 941       */
 942  	public function power() {
 943          if (func_num_args() > 0) {
 944              $args = func_get_args();
 945              $match = implode(",", array_map('gettype', $args));
 946  
 947              switch($match) {
 948                  case 'object':
 949                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
 950                          break;
 951                  case 'array':
 952                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
 953                          break;
 954                  default:
 955                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 956                          break;
 957              }
 958              $this->checkMatrixDimensions($M);
 959              for($i = 0; $i < $this->m; ++$i) {
 960                  for($j = 0; $j < $this->n; ++$j) {
 961                      $validValues = True;
 962                      $value = $M->get($i, $j);
 963                      if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
 964                          $this->A[$i][$j] = trim($this->A[$i][$j],'"');
 965                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]);
 966                      }
 967                      if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
 968                          $value = trim($value,'"');
 969                          $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value);
 970                      }
 971                      if ($validValues) {
 972                          $this->A[$i][$j] = pow($this->A[$i][$j],$value);
 973                      } else {
 974                          $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN();
 975                      }
 976                  }
 977              }
 978              return $this;
 979          } else {
 980              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
 981          }
 982      }    //    function power()
 983  
 984  
 985      /**
 986       *    concat
 987       *
 988       *    A = A & B
 989       *    @param mixed $B Matrix/Array
 990       *    @return Matrix Sum
 991       */
 992  	public function concat() {
 993          if (func_num_args() > 0) {
 994              $args = func_get_args();
 995              $match = implode(",", array_map('gettype', $args));
 996  
 997              switch($match) {
 998                  case 'object':
 999                          if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { $M = $args[0]; } else { throw new PHPExcel_Calculation_Exception(self::ArgumentTypeException); }
1000                  case 'array':
1001                          $M = new PHPExcel_Shared_JAMA_Matrix($args[0]);
1002                          break;
1003                  default:
1004                          throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
1005                          break;
1006              }
1007              $this->checkMatrixDimensions($M);
1008              for($i = 0; $i < $this->m; ++$i) {
1009                  for($j = 0; $j < $this->n; ++$j) {
1010                      $this->A[$i][$j] = trim($this->A[$i][$j],'"').trim($M->get($i, $j),'"');
1011                  }
1012              }
1013              return $this;
1014          } else {
1015              throw new PHPExcel_Calculation_Exception(self::PolymorphicArgumentException);
1016          }
1017      }    //    function concat()
1018  
1019  
1020      /**
1021       *    Solve A*X = B.
1022       *
1023       *    @param Matrix $B Right hand side
1024       *    @return Matrix ... Solution if A is square, least squares solution otherwise
1025       */
1026  	public function solve($B) {
1027          if ($this->m == $this->n) {
1028              $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this);
1029              return $LU->solve($B);
1030          } else {
1031              $QR = new QRDecomposition($this);
1032              return $QR->solve($B);
1033          }
1034      }    //    function solve()
1035  
1036  
1037      /**
1038       *    Matrix inverse or pseudoinverse.
1039       *
1040       *    @return Matrix ... Inverse(A) if A is square, pseudoinverse otherwise.
1041       */
1042  	public function inverse() {
1043          return $this->solve($this->identity($this->m, $this->m));
1044      }    //    function inverse()
1045  
1046  
1047      /**
1048       *    det
1049       *
1050       *    Calculate determinant
1051       *    @return float Determinant
1052       */
1053  	public function det() {
1054          $L = new PHPExcel_Shared_JAMA_LUDecomposition($this);
1055          return $L->det();
1056      }    //    function det()
1057  
1058  
1059  }    //    class PHPExcel_Shared_JAMA_Matrix


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1