Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

from __future__ import print_function, division 

 

from sympy import Basic 

from sympy.functions import adjoint, conjugate 

 

from sympy.matrices.expressions.matexpr import MatrixExpr 

 

class Transpose(MatrixExpr): 

    """ 

    The transpose of a matrix expression. 

 

    This is a symbolic object that simply stores its argument without 

    evaluating it. To actually compute the transpose, use the ``transpose()`` 

    function, or the ``.T`` attribute of matrices. 

 

    Examples 

    ======== 

 

    >>> from sympy.matrices import MatrixSymbol, Transpose 

    >>> from sympy.functions import transpose 

    >>> A = MatrixSymbol('A', 3, 5) 

    >>> B = MatrixSymbol('B', 5, 3) 

    >>> Transpose(A) 

    A' 

    >>> A.T == transpose(A) == Transpose(A) 

    True 

    >>> Transpose(A*B) 

    (A*B)' 

    >>> transpose(A*B) 

    B'*A' 

 

    """ 

    is_Transpose = True 

 

    def doit(self, **hints): 

        arg = self.arg 

        if hints.get('deep', True) and isinstance(arg, Basic): 

            arg = arg.doit(**hints) 

        try: 

            result = arg._eval_transpose() 

            return result if result is not None else Transpose(arg) 

        except AttributeError: 

            return Transpose(arg) 

 

    @property 

    def arg(self): 

        return self.args[0] 

 

    @property 

    def shape(self): 

        return self.arg.shape[::-1] 

 

    def _entry(self, i, j): 

        return self.arg._entry(j, i) 

 

    def _eval_adjoint(self): 

        return conjugate(self.arg) 

 

    def _eval_conjugate(self): 

        return adjoint(self.arg) 

 

    def _eval_transpose(self): 

        return self.arg 

 

    def _eval_trace(self): 

        from .trace import Trace 

        return Trace(self.arg)  # Trace(X.T) => Trace(X) 

 

    def _eval_determinant(self): 

        from sympy.matrices.expressions.determinant import det 

        return det(self.arg) 

 

def transpose(expr): 

    """ Matrix transpose """ 

    return Transpose(expr).doit() 

 

 

from sympy.assumptions.ask import ask, Q 

from sympy.assumptions.refine import handlers_dict 

 

 

def refine_Transpose(expr, assumptions): 

    """ 

    >>> from sympy import MatrixSymbol, Q, assuming, refine 

    >>> X = MatrixSymbol('X', 2, 2) 

    >>> X.T 

    X' 

    >>> with assuming(Q.symmetric(X)): 

    ...     print(refine(X.T)) 

    X 

    """ 

    if ask(Q.symmetric(expr), assumptions): 

        return expr.arg 

 

    return expr 

 

handlers_dict['Transpose'] = refine_Transpose