/** * Assembles Q using the single givens rotations. * * @return matrix Q */ public function getQ() { // Q is an m x m matrix if m is the maximum of the number of rows and thenumber of columns. $m = max($this->_matrix->columns(), $this->_matrix->rows()); $Q = new Matrix($m, $m); $Q->setAll(0.0); // Begin with the identity matrix. for ($i = 0; $i < min($Q->rows(), $Q->columns()); $i++) { $Q->set($i, $i, 1.0); } // Got backwards through all householder transformations and apply them on for ($k = $this->_matrix->columns() - 1; $k >= 0; $k--) { for ($j = $k; $j < $Q->columns(); $j++) { // First compute w^T(j) = v^T * Q(j) where Q(j) is the j-th column of Q. $w = $Q->get($k, $j) * 1.0; for ($i = $k + 1; $i < $Q->rows(); $i++) { $w += $this->_matrix->get($i, $k) * $Q->get($i, $j); } // Now : Q(i,j) = Q(i,j) - tau(k)*v(i)*w(j). $Q->set($k, $j, $Q->get($k, $j) - $this->_tau->get($k) * 1.0 * $w); for ($i = $k + 1; $i < $Q->rows(); $i++) { $Q->set($i, $j, $Q->get($i, $j) - $this->_tau->get($k) * $this->_matrix->get($i, $k) * $w); } } } return $Q; }
/** * Calculate the determinant of the matrix with the given lu decomposition. * * @param matrix lu decomposition * @param vector permutation vector of the lu decomposition */ public function getDeterminant() { // Calculate number of swapped rows. $swapped = 0; for ($i = 0; $i < $this->_permutation->size(); $i++) { if ($this->_permutation->get($i) != $i) { $swapped++; } } $determinant = pow(-1, $swapped); for ($i = 0; $i < $this->_matrix->rows(); $i++) { $determinant *= $this->_matrix->get($i, $i); } return $determinant; }
/** * Build the inner product of two vectors. * * @param vector $a * @param vector $b * @return vector inner product */ public static function inner($a, $b) { new Assertion($a instanceof Vector, 'Given first vector not of class Vector.'); new Assertion($b instanceof Vector, 'Given second vector not of class Vector.'); new Assertion($a->size() == $b->size(), 'Dimensions do not match.'); $size = $a->size(); $result = 0; for ($i = 0; $i < $size; $i++) { $result += $a->get($i) * $b->get($i); } return $result; }