55 $this->buildFromArray(array_values(
$grid));
65 $this->rows = count(
$grid);
68 function ($carry, $value) {
69 return max($carry, is_array($value) ? count($value) : 1);
77 if (!is_array($value)) {
80 $value = array_pad(array_values($value),
$columns,
null);
96 if ((!is_numeric(
$row)) || (intval(
$row) < 1)) {
112 if ((!is_numeric($column)) || (intval($column) < 1)) {
129 if (
$row > $this->rows) {
130 throw new Exception(
'Requested Row exceeds matrix size');
145 $column = static::validateColumn($column);
146 if ($column > $this->columns) {
147 throw new Exception(
'Requested Column exceeds matrix size');
167 $row = $this->validateRowInRange(
$row);
168 if ($rowCount === 0) {
169 $rowCount = $this->rows -
$row + 1;
172 return new static(array_slice($this->grid,
$row - 1, (
int)$rowCount));
189 $column = $this->validateColumnInRange($column);
196 $grid[] = array_column($this->grid,
$i);
199 return (
new static(
$grid))->transpose();
217 $this->validateRowInRange(
$row);
218 if ($rowCount === 0) {
219 $rowCount = $this->rows -
$row + 1;
223 array_splice(
$grid,
$row - 1, (
int)$rowCount);
225 return new static(
$grid);
243 $this->validateColumnInRange($column);
256 return new static(
$grid);
270 $row = $this->validateRowInRange(
$row);
271 $column = $this->validateColumnInRange($column);
273 return $this->grid[
$row - 1][$column - 1];
282 public function rows(): Generator
284 foreach ($this->grid as
$i =>
$row) {
285 yield
$i + 1 => ($this->columns == 1)
287 :
new static([
$row]);
300 yield
$i + 1 => ($this->rows == 1)
302 :
new static(array_column($this->grid,
$i));
325 return $this->rows === 1 || $this->columns === 1;
349 if ($this->columns === $this->rows) {
350 return (
new LU($this))->solve($B);
353 return (
new QR($this))->solve($B);
356 protected static $getters = [
368 public function __get(
string $propertyName)
370 $propertyName = strtolower($propertyName);
373 if (in_array($propertyName, self::$getters)) {
374 return $this->$propertyName;
377 throw new Exception(
'Property does not exist');
380 protected static $functions = [
393 protected static $operations = [
410 public function __call(
string $functionName, $arguments)
412 $functionName = strtolower(str_replace(
'_',
'', $functionName));
414 if (in_array($functionName, self::$functions,
true) || in_array($functionName, self::$operations,
true)) {
415 $functionName =
"\\" . __NAMESPACE__ .
"\\{$functionName}";
416 if (is_callable($functionName)) {
417 $arguments = array_values(array_merge([$this], $arguments));
418 return call_user_func_array($functionName, $arguments);
421 throw new Exception(
'Function or Operation does not exist');
An exception for terminatinating execution or to throw for unit testing.
validateColumnInRange(int $column)
Validate that a column number falls within the set of columns for this matrix.
static validateColumn(int $column)
Validate that a column number is a positive integer.
isSquare()
Identify if the row and column dimensions of this matrix are equal, i.e.
dropColumns(int $column, int $columnCount=1)
Return a new matrix as a subset of columns from this matrix, dropping columns starting at column numb...
static validateRow(int $row)
Validate that a row number is a positive integer.
getColumns(int $column, int $columnCount=1)
Return a new matrix as a subset of columns from this matrix, starting at column number $column,...
buildFromArray(array $grid)
__call(string $functionName, $arguments)
Returns the result of the function call or operation.
getRows(int $row, int $rowCount=1)
Return a new matrix as a subset of rows from this matrix, starting at row number $row,...
__get(string $propertyName)
Access specific properties as read-only (no setters)
rows()
Returns a Generator that will yield each row of the matrix in turn as a vector matrix or the value of...
dropRows(int $row, int $rowCount=1)
Return a new matrix as a subset of rows from this matrix, dropping rows starting at row number $row,...
isVector()
Identify if this matrix is a vector i.e.
solve(Matrix $B)
Solve A*X = B.
toArray()
Return the matrix as a 2-dimensional array.
validateRowInRange(int $row)
Validate that a row number falls within the set of rows for this matrix.
getValue(int $row, int $column)
Return a value from this matrix, from the "cell" identified by the row and column numbers Note that r...
columns()
Returns a Generator that will yield each column of the matrix in turn as a vector matrix or the value...
Class for the creating "special" Matrices.