@@ -738,19 +738,7 @@ def _trace(self) -> np.number:
738
738
trace : float
739
739
Trace of the linear operator.
740
740
"""
741
-
742
- vec = np .zeros (self .shape [1 ], dtype = self .dtype )
743
-
744
- vec [0 ] = 1
745
- trace = (self @ vec )[0 ]
746
- vec [0 ] = 0
747
-
748
- for i in range (1 , self .shape [0 ]):
749
- vec [i ] = 1
750
- trace += (self @ vec )[i ]
751
- vec [i ] = 0
752
-
753
- return trace
741
+ return np .sum (self .diagonal ())
754
742
755
743
def trace (self ) -> np .number :
756
744
r"""Trace of the linear operator.
@@ -783,7 +771,16 @@ def _diagonal(self) -> np.ndarray:
783
771
784
772
You may implement this method in a subclass.
785
773
"""
786
- return np .diagonal (self .todense (cache = False ))
774
+ D = np .min (self .shape )
775
+ diag = np .zeros (D , dtype = self .dtype )
776
+ vec = np .zeros (self .shape [1 ], dtype = self .dtype )
777
+
778
+ for i in range (D ):
779
+ vec [i ] = 1
780
+ diag [i ] = (self @ vec )[i ]
781
+ vec [i ] = 0
782
+
783
+ return diag
787
784
788
785
def diagonal (self ) -> np .ndarray :
789
786
"""Diagonal of the linear operator."""
@@ -1618,20 +1615,23 @@ def __init__(self, A: Union[ArrayLike, scipy.sparse.spmatrix]):
1618
1615
matmul = LinearOperator .broadcast_matmat (lambda x : self .A @ x )
1619
1616
todense = self .A .toarray
1620
1617
trace = lambda : self .A .diagonal ().sum ()
1618
+ diagonal = lambda : self .A .diagonal ()
1621
1619
else :
1622
1620
self .A = np .asarray (A )
1623
1621
self .A .setflags (write = False )
1624
1622
1625
1623
matmul = lambda x : self .A @ x
1626
1624
todense = lambda : self .A
1627
1625
trace = lambda : np .trace (self .A )
1626
+ diagonal = lambda : np .diagonal (self .A )
1628
1627
1629
1628
super ().__init__ (
1630
1629
self .A .shape ,
1631
1630
self .A .dtype ,
1632
1631
matmul = matmul ,
1633
1632
todense = todense ,
1634
1633
trace = trace ,
1634
+ diagonal = diagonal ,
1635
1635
)
1636
1636
1637
1637
def _transpose (self ) -> "Matrix" :
0 commit comments