public function calculateMatchQuality(GameInfo $gameInfo, array $teams) { // We need to create the A matrix which is the player team assigments. $teamAssignmentsList = $teams; $skillsMatrix = $this->getPlayerCovarianceMatrix($teamAssignmentsList); $meanVector = $this->getPlayerMeansVector($teamAssignmentsList); $meanVectorTranspose = $meanVector->getTranspose(); $playerTeamAssignmentsMatrix = $this->createPlayerTeamAssignmentMatrix($teamAssignmentsList, $meanVector->getRowCount()); $playerTeamAssignmentsMatrixTranspose = $playerTeamAssignmentsMatrix->getTranspose(); $betaSquared = square($gameInfo->getBeta()); $start = Matrix::multiply($meanVectorTranspose, $playerTeamAssignmentsMatrix); $aTa = Matrix::multiply(Matrix::scalarMultiply($betaSquared, $playerTeamAssignmentsMatrixTranspose), $playerTeamAssignmentsMatrix); $aTSA = Matrix::multiply(Matrix::multiply($playerTeamAssignmentsMatrixTranspose, $skillsMatrix), $playerTeamAssignmentsMatrix); $middle = Matrix::add($aTa, $aTSA); $middleInverse = $middle->getInverse(); $end = Matrix::multiply($playerTeamAssignmentsMatrixTranspose, $meanVector); $expPartMatrix = Matrix::scalarMultiply(-0.5, Matrix::multiply(Matrix::multiply($start, $middleInverse), $end)); $expPart = $expPartMatrix->getDeterminant(); $sqrtPartNumerator = $aTa->getDeterminant(); $sqrtPartDenominator = $middle->getDeterminant(); $sqrtPart = $sqrtPartNumerator / $sqrtPartDenominator; $result = exp($expPart) * sqrt($sqrtPart); return $result; }
public function testInverse() { // see http://www.mathwords.com/i/inverse_of_a_matrix.htm $a = new SquareMatrix(4, 3, 3, 2); $b = new SquareMatrix(-2, 3, 3, -4); $aInverse = $a->getInverse(); $this->assertTrue($b->equals($aInverse)); $identity2x2 = new IdentityMatrix(2); $aaInverse = Matrix::multiply($a, $aInverse); $this->assertTrue($identity2x2->equals($aaInverse)); $c = new SquareMatrix(1, 2, 3, 0, 4, 5, 1, 0, 6); $cInverse = $c->getInverse(); $d = Matrix::scalarMultiply(1.0 / 22, new SquareMatrix(24, -12, -2, 5, 3, -5, -4, 2, 4)); $this->assertTrue($d->equals($cInverse)); $identity3x3 = new IdentityMatrix(3); $ccInverse = Matrix::multiply($c, $cInverse); $this->assertTrue($identity3x3->equals($ccInverse)); }