Coverage for /usr/lib/python3/dist-packages/sympy/matrices/expressions/transpose.py: 48%

48 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-14 15:55 +0200

1from sympy.core.basic import Basic 

2from sympy.functions import adjoint, conjugate 

3 

4from sympy.matrices.expressions.matexpr import MatrixExpr 

5 

6 

7class Transpose(MatrixExpr): 

8 """ 

9 The transpose of a matrix expression. 

10 

11 This is a symbolic object that simply stores its argument without 

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

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

14 

15 Examples 

16 ======== 

17 

18 >>> from sympy import MatrixSymbol, Transpose, transpose 

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

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

21 >>> Transpose(A) 

22 A.T 

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

24 True 

25 >>> Transpose(A*B) 

26 (A*B).T 

27 >>> transpose(A*B) 

28 B.T*A.T 

29 

30 """ 

31 is_Transpose = True 

32 

33 def doit(self, **hints): 

34 arg = self.arg 

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

36 arg = arg.doit(**hints) 

37 _eval_transpose = getattr(arg, '_eval_transpose', None) 

38 if _eval_transpose is not None: 

39 result = _eval_transpose() 

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

41 else: 

42 return Transpose(arg) 

43 

44 @property 

45 def arg(self): 

46 return self.args[0] 

47 

48 @property 

49 def shape(self): 

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

51 

52 def _entry(self, i, j, expand=False, **kwargs): 

53 return self.arg._entry(j, i, expand=expand, **kwargs) 

54 

55 def _eval_adjoint(self): 

56 return conjugate(self.arg) 

57 

58 def _eval_conjugate(self): 

59 return adjoint(self.arg) 

60 

61 def _eval_transpose(self): 

62 return self.arg 

63 

64 def _eval_trace(self): 

65 from .trace import Trace 

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

67 

68 def _eval_determinant(self): 

69 from sympy.matrices.expressions.determinant import det 

70 return det(self.arg) 

71 

72 def _eval_derivative(self, x): 

73 # x is a scalar: 

74 return self.arg._eval_derivative(x) 

75 

76 def _eval_derivative_matrix_lines(self, x): 

77 lines = self.args[0]._eval_derivative_matrix_lines(x) 

78 return [i.transpose() for i in lines] 

79 

80 

81def transpose(expr): 

82 """Matrix transpose""" 

83 return Transpose(expr).doit(deep=False) 

84 

85 

86from sympy.assumptions.ask import ask, Q 

87from sympy.assumptions.refine import handlers_dict 

88 

89 

90def refine_Transpose(expr, assumptions): 

91 """ 

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

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

94 >>> X.T 

95 X.T 

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

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

98 X 

99 """ 

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

101 return expr.arg 

102 

103 return expr 

104 

105handlers_dict['Transpose'] = refine_Transpose