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
« 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
4from sympy.matrices.expressions.matexpr import MatrixExpr
7class Transpose(MatrixExpr):
8 """
9 The transpose of a matrix expression.
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.
15 Examples
16 ========
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
30 """
31 is_Transpose = True
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)
44 @property
45 def arg(self):
46 return self.args[0]
48 @property
49 def shape(self):
50 return self.arg.shape[::-1]
52 def _entry(self, i, j, expand=False, **kwargs):
53 return self.arg._entry(j, i, expand=expand, **kwargs)
55 def _eval_adjoint(self):
56 return conjugate(self.arg)
58 def _eval_conjugate(self):
59 return adjoint(self.arg)
61 def _eval_transpose(self):
62 return self.arg
64 def _eval_trace(self):
65 from .trace import Trace
66 return Trace(self.arg) # Trace(X.T) => Trace(X)
68 def _eval_determinant(self):
69 from sympy.matrices.expressions.determinant import det
70 return det(self.arg)
72 def _eval_derivative(self, x):
73 # x is a scalar:
74 return self.arg._eval_derivative(x)
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]
81def transpose(expr):
82 """Matrix transpose"""
83 return Transpose(expr).doit(deep=False)
86from sympy.assumptions.ask import ask, Q
87from sympy.assumptions.refine import handlers_dict
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
103 return expr
105handlers_dict['Transpose'] = refine_Transpose