Ejemplo n.º 1
0
 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));
 }
 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;
 }