diff --git a/Math/Matrix/IdentityMatrix.php b/Math/Matrix/IdentityMatrix.php index 3cd6f41b1..fade82ece 100644 --- a/Math/Matrix/IdentityMatrix.php +++ b/Math/Matrix/IdentityMatrix.php @@ -1,6 +1,6 @@ n = $n; $this->m = $m; @@ -21,24 +21,143 @@ class Matrix implements ArrayAccess, Iterator public function setMatrix(array $matrix) { + if($this->m !== count($matrix) || $this->n !== count($matrix[0])) { + throw new \Exception('Dimension'); + } + $this->matrix = $matrix; } - public function set(int $n, int $m, $value) + public function getMatrix() : array { - $this->matrix[$n][$m] = $value; + return $this->matrix; } - public function get(int $n, int $m) + public function set(int $m, int $n, $value) { - return $this->matrix[$n][$m]; + $this->matrix[$m][$n] = $value; + } + + public function get(int $m, int $n) + { + return $this->matrix[$m][$n]; } public function transpose() : Matrix { - $matrix = new Matrix($this->m, $this->n); + $matrix = new Matrix($this->n, $this->m); $matrix->setMatrix(array_map(null, ...$matrix)); return $matrix; } + + public function mult($value) : Matrix + { + if($value instanceOf Matrix) { + return $this->multMatrix($value); + } elseif(is_scalar($value)) { + return $this->multScalar($value); + } + } + + private function multMatrix(Matrix $matrix) : Matrix + { + $nDim = $matrix->getN(); + $mDim = $matrix->getM(); + + if($this->n !== $mDim) { + throw new \Exception('Dimension'); + } + + $matrixArr = $matrix->getMatrix(); + $newMatrix = new Matrix($this->m, $nDim); + $newMatrixArr = $newMatrix->getMatrix(); + + for($i = 0; $i < $this->m; $i++) { // Row of $this + for($c = 0; $c < $nDim; $c++) { // Column of $matrix + $temp = 0; + + for($j = 0; $j < $mDim; $i++) { // Row of $matrix + $temp += $this->matrix[$i][$j] * $matrixArr[$j][$c]; + } + + $newMatrixArr[$i][$c] = $temp; + } + } + + $newMatrix->setMatrix($newMatrixArr); + + return $newMatrix; + } + + private function multScalar($value) : Matrix + { + $newMatrixArr = $this->matrix; + + foreach($newMatrixArr as $i => $vector) { + foreach($vector as $j => $value) { + $newMatrixArr[$i][$j] *= $value; + } + } + + $newMatrix = new Matrix($this->m, $this->n); + $newMatrix->setMatrix($newMatrixArr); + + return $newMatrix; + } + + public function add($value) : Matrix + { + if($value instanceOf Matrix) { + return $this->addMatrix($value); + } elseif(is_scalar($value)) { + return $this->addScalar($value); + } + } + + public function sub($value) : Matrix + { + if($value instanceOf Matrix) { + return $this->add($this->multMatrix(-1)); + } elseif(is_scalar($value)) { + return $this->addScalar(-$value); + } + } + + private function addMatrix(Matrix $value) : Matrix + { + if($this->m !== $value->getM() || $this->n !== $value->getN()) { + throw new \Exception('Dimension'); + } + + $matrixArr = $value->getMatrix(); + $newMatrixArr = $this->matrix; + + foreach($newMatrixArr as $i => $vector) { + foreach($vector as $j => $value) { + $newMatrixArr[$i][$j] += $matrixArr[$i][$j]; + } + } + + $newMatrix = new Matrix($this->m, $this->n); + $newMatrix->setMatrix($newMatrixArr); + + return $newMatrix; + } + + private function addScalar($value) : Matrix + { + $newMatrixArr = $this->matrix; + + foreach($newMatrixArr as $i => $vector) { + foreach($vector as $j => $value) { + $newMatrixArr[$i][$j] += $value; + } + } + + $newMatrix = new Matrix($this->m, $this->n); + $newMatrix->setMatrix($newMatrixArr); + + return $newMatrix; + } } \ No newline at end of file diff --git a/Math/Matrix/Vector.php b/Math/Matrix/Vector.php index 790f23f0c..90967100f 100644 --- a/Math/Matrix/Vector.php +++ b/Math/Matrix/Vector.php @@ -1,67 +1,10 @@ -abstract class Vector { -private $vector = null; +vector = $vector; -} - -public function setVectorElement($i, $element) { -$this->vector[$i] = $element; -} - -public function addVector() { - -} - -public function addScalar() { - -} - -public function subVector() { - -} - -public function subScalar() { - -} - -public function multVector() { - -} - -public function multScalar() { - -} - -public function divVector() { - -} - -public function divScalar() { - -} - -public function getLength() { - -} - -public function normalize() { - -} - -public function getAngular() { - -} - -public function multMatrix() { - -} - -public function divMatrix() { - -} +class Vector extends Matrix { + public function __constrcut(int $m) + { + parent::__construct($m); + } } \ No newline at end of file