2016-05-24 14:06:43 +02:00
< ? php namespace Moserware\Skills\Tests\Numerics ;
2010-09-01 08:21:10 -04:00
2010-09-01 22:17:00 -04:00
use Moserware\Numerics\Matrix ;
2010-09-03 07:25:55 -04:00
use Moserware\Numerics\IdentityMatrix ;
2010-09-01 08:21:10 -04:00
use Moserware\Numerics\SquareMatrix ;
2016-05-24 14:06:43 +02:00
use Moserware\Skills\Tests\TestCase ;
2010-09-01 08:21:10 -04:00
2016-05-24 14:06:43 +02:00
class MatrixTest extends TestCase
2010-09-01 08:21:10 -04:00
{
public function testTwoByTwoDeterminant ()
{
$a = new SquareMatrix ( 1 , 2 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( - 2 , $a -> getDeterminant ());
$b = new SquareMatrix ( 3 , 4 ,
2016-05-24 13:59:35 +02:00
5 , 6 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( - 2 , $b -> getDeterminant ());
$c = new SquareMatrix ( 1 , 1 ,
2016-05-24 13:59:35 +02:00
1 , 1 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( 0 , $c -> getDeterminant ());
$d = new SquareMatrix ( 12 , 15 ,
2016-05-24 13:59:35 +02:00
17 , 21 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( 12 * 21 - 15 * 17 , $d -> getDeterminant ());
}
public function testThreeByThreeDeterminant ()
{
$a = new SquareMatrix ( 1 , 2 , 3 ,
2016-05-24 13:59:35 +02:00
4 , 5 , 6 ,
7 , 8 , 9 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( 0 , $a -> getDeterminant ());
$pi = new SquareMatrix ( 3 , 1 , 4 ,
2016-05-24 13:59:35 +02:00
1 , 5 , 9 ,
2 , 6 , 5 );
2010-09-01 08:21:10 -04:00
// Verified against http://www.wolframalpha.com/input/?i=determinant+%7B%7B3%2C1%2C4%7D%2C%7B1%2C5%2C9%7D%2C%7B2%2C6%2C5%7D%7D
$this -> assertEquals ( - 90 , $pi -> getDeterminant ());
}
public function testFourByFourDeterminant ()
{
2016-05-24 13:59:35 +02:00
$a = new SquareMatrix ( 1 , 2 , 3 , 4 ,
5 , 6 , 7 , 8 ,
9 , 10 , 11 , 12 ,
13 , 14 , 15 , 16 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( 0 , $a -> getDeterminant ());
$pi = new SquareMatrix ( 3 , 1 , 4 , 1 ,
2016-05-24 13:59:35 +02:00
5 , 9 , 2 , 6 ,
5 , 3 , 5 , 8 ,
9 , 7 , 9 , 3 );
2010-09-01 08:21:10 -04:00
// Verified against http://www.wolframalpha.com/input/?i=determinant+%7B+%7B3%2C1%2C4%2C1%7D%2C+%7B5%2C9%2C2%2C6%7D%2C+%7B5%2C3%2C5%2C8%7D%2C+%7B9%2C7%2C9%2C3%7D%7D
$this -> assertEquals ( 98 , $pi -> getDeterminant ());
}
2016-05-24 13:59:35 +02:00
2010-09-01 08:21:10 -04:00
public function testEightByEightDeterminant ()
{
2016-05-24 13:59:35 +02:00
$a = new SquareMatrix ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ,
9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ,
17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 ,
25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 ,
33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 ,
41 , 42 , 32 , 44 , 45 , 46 , 47 , 48 ,
49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 ,
57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 );
2010-09-01 08:21:10 -04:00
$this -> assertEquals ( 0 , $a -> getDeterminant ());
$pi = new SquareMatrix ( 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ,
2016-05-24 13:59:35 +02:00
5 , 3 , 5 , 8 , 9 , 7 , 9 , 3 ,
2 , 3 , 8 , 4 , 6 , 2 , 6 , 4 ,
3 , 3 , 8 , 3 , 2 , 7 , 9 , 5 ,
0 , 2 , 8 , 8 , 4 , 1 , 9 , 7 ,
1 , 6 , 9 , 3 , 9 , 9 , 3 , 7 ,
5 , 1 , 0 , 5 , 8 , 2 , 0 , 9 ,
7 , 4 , 9 , 4 , 4 , 5 , 9 , 2 );
2010-09-01 08:21:10 -04:00
// Verified against http://www.wolframalpha.com/input/?i=det+%7B%7B3%2C1%2C4%2C1%2C5%2C9%2C2%2C6%7D%2C%7B5%2C3%2C5%2C8%2C9%2C7%2C9%2C3%7D%2C%7B2%2C3%2C8%2C4%2C6%2C2%2C6%2C4%7D%2C%7B3%2C3%2C8%2C3%2C2%2C7%2C9%2C5%7D%2C%7B0%2C2%2C8%2C8%2C4%2C1%2C9%2C7%7D%2C%7B1%2C6%2C9%2C3%2C9%2C9%2C3%2C7%7D%2C%7B5%2C1%2C0%2C5%2C8%2C2%2C0%2C9%7D%2C%7B7%2C4%2C9%2C4%2C4%2C5%2C9%2C2%7D%7D
$this -> assertEquals ( 1378143 , $pi -> getDeterminant ());
}
2010-09-01 22:17:00 -04:00
public function testEquals ()
{
$a = new SquareMatrix ( 1 , 2 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-01 22:17:00 -04:00
$b = new SquareMatrix ( 1 , 2 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-01 22:17:00 -04:00
$this -> assertTrue ( $a -> equals ( $b ));
$c = Matrix :: fromRowsColumns ( 2 , 3 ,
2016-05-24 13:59:35 +02:00
1 , 2 , 3 ,
4 , 5 , 6 );
2010-09-01 22:17:00 -04:00
$d = Matrix :: fromRowsColumns ( 2 , 3 ,
2016-05-24 13:59:35 +02:00
1 , 2 , 3 ,
4 , 5 , 6 );
2010-09-01 22:17:00 -04:00
$this -> assertTrue ( $c -> equals ( $d ));
$e = Matrix :: fromRowsColumns ( 3 , 2 ,
2016-05-24 13:59:35 +02:00
1 , 4 ,
2 , 5 ,
3 , 6 );
2010-09-01 22:17:00 -04:00
$f = $e -> getTranspose ();
$this -> assertTrue ( $d -> equals ( $f ));
// Test rounding (thanks to nsp on GitHub for finding this case)
$g = new SquareMatrix ( 1 , 2.00000000000001 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-01 22:17:00 -04:00
$h = new SquareMatrix ( 1 , 2 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-01 22:17:00 -04:00
$this -> assertTrue ( $g -> equals ( $h ));
}
2010-09-03 07:25:55 -04:00
public function testAdjugate ()
{
// From Wikipedia: http://en.wikipedia.org/wiki/Adjugate_matrix
$a = new SquareMatrix ( 1 , 2 ,
2016-05-24 13:59:35 +02:00
3 , 4 );
2010-09-03 07:25:55 -04:00
2016-05-24 13:59:35 +02:00
$b = new SquareMatrix ( 4 , - 2 ,
- 3 , 1 );
2010-09-03 07:25:55 -04:00
$this -> assertTrue ( $b -> equals ( $a -> getAdjugate ()));
2016-05-24 13:59:35 +02:00
$c = new SquareMatrix ( - 3 , 2 , - 5 ,
- 1 , 0 , - 2 ,
3 , - 4 , 1 );
2010-09-03 07:25:55 -04:00
$d = new SquareMatrix ( - 8 , 18 , - 4 ,
2016-05-24 13:59:35 +02:00
- 5 , 12 , - 1 ,
4 , - 6 , 2 );
2010-09-03 07:25:55 -04:00
$this -> assertTrue ( $d -> equals ( $c -> getAdjugate ()));
}
public function testInverse ()
{
// see http://www.mathwords.com/i/inverse_of_a_matrix.htm
$a = new SquareMatrix ( 4 , 3 ,
2016-05-24 13:59:35 +02:00
3 , 2 );
2010-09-03 07:25:55 -04:00
2016-05-24 13:59:35 +02:00
$b = new SquareMatrix ( - 2 , 3 ,
3 , - 4 );
2010-09-03 07:25:55 -04:00
$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 ,
2016-05-24 13:59:35 +02:00
0 , 4 , 5 ,
1 , 0 , 6 );
2010-09-03 07:25:55 -04:00
$cInverse = $c -> getInverse ();
$d = Matrix :: scalarMultiply (( 1.0 / 22 ), new SquareMatrix ( 24 , - 12 , - 2 ,
2016-05-24 13:59:35 +02:00
5 , 3 , - 5 ,
- 4 , 2 , 4 ));
2010-09-03 07:25:55 -04:00
$this -> assertTrue ( $d -> equals ( $cInverse ));
$identity3x3 = new IdentityMatrix ( 3 );
$ccInverse = Matrix :: multiply ( $c , $cInverse );
$this -> assertTrue ( $identity3x3 -> equals ( $ccInverse ));
}
2016-05-24 13:59:35 +02:00
}