def test_matrix_multiplication(self): m = Matrix(rows=[[1, 2], [3, 4]]) # Left and right multiplication with identity self.assertEqual(Matrix.identity(2) * m, m) self.assertEqual(m * Matrix.identity(2), m) # Left and right multiplication with zero self.assertEqual(Matrix.zero(2) * m, Matrix.zero(2)) self.assertEqual(m * Matrix.zero(2), Matrix.zero(2)) # Scaling by multiplication with scaled identity self.assertEqual((5 * Matrix.identity(2)) * m, 5 * m) self.assertEqual(m * (5 * Matrix.identity(2)), 5 * m) # Multiplications m1 = Matrix(rows=[[1, 2], [3, 4]]) m2 = Matrix(rows=[[5, 6], [7, 8]]) m3 = Matrix(rows=[[19, 22], [43, 50]]) flip = Matrix(rows=[[1, 0], [0, -1]]) turn = Matrix(rows=[[0, -1], [1, 0]]) self.assertEqual(flip * m1, Matrix(rows=[[1, 2], [-3, -4]])) # Invert y self.assertEqual(m1 * flip, Matrix(rows=[[1, -2], [3, -4]])) self.assertEqual( turn * m1, Matrix(rows=[[-3, -4], [1, 2]])) # Rotate by 90 degrees self.assertEqual(m1 * m2, m3) # Arbitrary # 2x3 * 3x2 self.assertEqual( Matrix(rows=[[10, 11, 12], [13, 14, 15]]) * Matrix(rows=[[16, 17], [18, 19], [20, 21]]), Matrix(rows=[[598, 631], [760, 802]])) # 3x2 * 2x3 self.assertEqual( Matrix(rows=[[10, 11], [12, 13], [14, 15]]) * Matrix(rows=[[16, 17, 18], [19, 20, 21]]), Matrix(rows=[[369, 390, 411], [439, 464, 489], [509, 538, 567]])) # 3x3 self.assertEqual( Matrix(rows=[[10, 11, 12], [13, 14, 15], [16, 17, 18]]) * Matrix(rows=[[19, 20, 21], [22, 23, 24], [25, 26, 27]]), Matrix( rows=[[732, 765, 798], [930, 972, 1014], [1128, 1179, 1230]])) # Dimensions mismatch with self.assertRaises(ValueError): Matrix.identity(3) * m with self.assertRaises(ValueError): m * Matrix.identity(3) with self.assertRaises(ValueError): (Matrix(rows=[[16, 17, 18], [19, 20, 21]]) * Matrix(rows=[[10, 11], [12, 13]]))
def test_matrix_multiplication(self): # Identity * Vector self.assertEqual( Matrix.identity(3) * Vector(1, 3, 10), Vector(1, 3, 10)) with self.assertRaises(ValueError): Matrix.identity(4) * Vector(1, 2, 3) # Zero * Vector self.assertEqual(Matrix.zero(3) * Vector(1, 2, 3), Vector(0, 0, 0)) # (Square) Matrix * Vector m = Matrix(rows=[[1, 1, 1], [0, 1, 1], [0, 0, 1]]) self.assertEqual(m * Vector(0, 0, 0), Vector(0, 0, 0)) self.assertEqual(m * Vector(1, 2, 3), Vector(6, 5, 3)) with self.assertRaises(ValueError): m * Vector(1, 2, 3, 4) # (Non-square) Matrix * Vector m = Matrix(rows=[[1, 1, 1], [0, 2, 2], [0, 3, 0], [0, 0, 4]]) self.assertEqual(m * Vector(0, 0, 0), Vector(0, 0, 0, 0)) self.assertEqual(m * Vector(1, 2, 3), Vector(6, 10, 6, 12)) with self.assertRaises(ValueError): m * Vector(1, 2, 3, 4) # Scaling by multiplication with scaled identity self.assertEqual((5 * Matrix.identity(3)) * Vector(1, 2, 3), Vector(5, 10, 15)) # Vector * Matrix is invalid with self.assertRaises(TypeError): Vector(1, 2, 3) * Matrix.identity(3)
def test_zero(self): self.assertEqual(Matrix.zero(0).row_values, []) self.assertEqual(Matrix.zero(1).row_values, [[0]]) self.assertEqual(Matrix.zero(2).row_values, [[0, 0], [0, 0]]) self.assertEqual( Matrix.zero(3).row_values, [[0, 0, 0], [0, 0, 0], [0, 0, 0]])