示例#1
0
    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]]))
示例#2
0
    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)
示例#3
0
 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]])