Я видел этот вопрос и высказывал эту идею.
Есть ли эффективный способ сделать это в PHP?
РЕДАКТИРОВАТЬ
Лучше всего с демо?
Для этого вы можете использовать пакет груши Math_Matrix .
Этот пакет утверждает, что способен делать то, что вы ищете.
/** * matrix_inverse * * Matrix Inverse * Guass-Jordan Elimination Method * Reduced Row Eshelon Form (RREF) * * In linear algebra an n-by-n (square) matrix A is called invertible (some * authors use nonsingular or nondegenerate) if there exists an n-by-n matrix B * such that AB = BA = In where In denotes the n-by-n identity matrix and the * multiplication used is ordinary matrix multiplication. If this is the case, * then the matrix B is uniquely determined by A and is called the inverse of A, * denoted by A-1. It follows from the theory of matrices that if for finite * square matrices A and B, then also non-square matrices (m-by-n matrices for * which m ? n) do not have an inverse. However, in some cases such a matrix may * have a left inverse or right inverse. If A is m-by-n and the rank of A is * equal to n, then A has a left inverse: an n-by-m matrix B such that BA = I. * If A has rank m, then it has a right inverse: an n-by-m matrix B such that * AB = I. * * A square matrix that is not invertible is called singular or degenerate. A * square matrix is singular if and only if its determinant is 0. Singular * matrices are rare in the sense that if you pick a random square matrix over * a continuous uniform distribution on its entries, it will almost surely not * be singular. * * While the most common case is that of matrices over the real or complex * numbers, all these definitions can be given for matrices over any commutative * ring. However, in this case the condition for a square matrix to be * invertible is that its determinant is invertible in the ring, which in * general is a much stricter requirement than being nonzero. The conditions for * existence of left-inverse resp. right-inverse are more complicated since a * notion of rank does not exist over rings. */ public function matrix_inverse($m1) { $rows = $this->rows($m1); $cols = $this->columns($m1); if ($rows != $cols) { die("Matrim1 is not square. Can not be inverted."); } $m2 = $this->eye($rows); for ($j = 0; $j < $cols; $j++) { $factor = $m1[$j][$j]; if ($this->debug) { fms_writeln('Divide Row [' . $j . '] by ' . $m1[$j][$j] . ' (to give us a "1" in the desired position):'); } $m1 = $this->rref_div($m1, $j, $factor); $m2 = $this->rref_div($m2, $j, $factor); if ($this->debug) { $this->disp2($m1, $m2); } for ($i = 0; $i < $rows; $i++) { if ($i != $j) { $factor = $m1[$i][$j]; if ($this->debug) { $this->writeln('Row[' . $i . '] - ' . number_format($factor, 4) . ' × Row[' . $j . '] (to give us 0 in the desired position):'); } $m1 = $this->rref_sub($m1, $i, $factor, $j); $m2 = $this->rref_sub($m2, $i, $factor, $j); if ($this->debug) { $this->disp2($m1, $m2); } } } } return $m2; }
Существует библиотека PHP с открытым исходным кодом, которая способна инвертировать матрицу.
Все, что вам нужно сделать, это
<?php include_once ("Matrix.class.php"); $matrixA = new Matrix(array(array(0, 1), array(2, 6))); echo $matrixA->getInverse()->getMathMl(); ?>
Здесь проверен код https://gist.github.com/unix1/7510208 Достаточно только функций identity_matrix () и invert ()