@@ -850,35 +850,74 @@ fillstored!(A::UpperTriangular, x) = (fillband!(A.data, x, 0, size(A,2)-1);
850
850
fillstored! (A:: UnitUpperTriangular , x) = (fillband! (A. data, x, 1 , size (A,2 )- 1 ); A)
851
851
852
852
# Binary operations
853
- + (A:: UpperTriangular , B:: UpperTriangular ) = UpperTriangular (A. data + B. data)
854
- + (A:: LowerTriangular , B:: LowerTriangular ) = LowerTriangular (A. data + B. data)
855
- + (A:: UpperTriangular , B:: UnitUpperTriangular ) = UpperTriangular (A. data + triu (B. data, 1 ) + I)
856
- + (A:: LowerTriangular , B:: UnitLowerTriangular ) = LowerTriangular (A. data + tril (B. data, - 1 ) + I)
857
- + (A:: UnitUpperTriangular , B:: UpperTriangular ) = UpperTriangular (triu (A. data, 1 ) + B. data + I)
858
- + (A:: UnitLowerTriangular , B:: LowerTriangular ) = LowerTriangular (tril (A. data, - 1 ) + B. data + I)
859
- + (A:: UnitUpperTriangular , B:: UnitUpperTriangular ) = UpperTriangular (triu (A. data, 1 ) + triu (B. data, 1 ) + 2 I)
860
- + (A:: UnitLowerTriangular , B:: UnitLowerTriangular ) = LowerTriangular (tril (A. data, - 1 ) + tril (B. data, - 1 ) + 2 I)
853
+ # use broadcasting if the parents are strided, where we loop only over the triangular part
854
+ function + (A:: UpperTriangular , B:: UpperTriangular )
855
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
856
+ UpperTriangular (A. data + B. data)
857
+ end
858
+ function + (A:: LowerTriangular , B:: LowerTriangular )
859
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
860
+ LowerTriangular (A. data + B. data)
861
+ end
862
+ function + (A:: UpperTriangular , B:: UnitUpperTriangular )
863
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
864
+ UpperTriangular (A. data + triu (B. data, 1 ) + I)
865
+ end
866
+ function + (A:: LowerTriangular , B:: UnitLowerTriangular )
867
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
868
+ LowerTriangular (A. data + tril (B. data, - 1 ) + I)
869
+ end
870
+ function + (A:: UnitUpperTriangular , B:: UpperTriangular )
871
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
872
+ UpperTriangular (triu (A. data, 1 ) + B. data + I)
873
+ end
874
+ function + (A:: UnitLowerTriangular , B:: LowerTriangular )
875
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
876
+ LowerTriangular (tril (A. data, - 1 ) + B. data + I)
877
+ end
878
+ function + (A:: UnitUpperTriangular , B:: UnitUpperTriangular )
879
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
880
+ UpperTriangular (triu (A. data, 1 ) + triu (B. data, 1 ) + 2 I)
881
+ end
882
+ function + (A:: UnitLowerTriangular , B:: UnitLowerTriangular )
883
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .+ B
884
+ LowerTriangular (tril (A. data, - 1 ) + tril (B. data, - 1 ) + 2 I)
885
+ end
861
886
+ (A:: AbstractTriangular , B:: AbstractTriangular ) = copyto! (similar (parent (A)), A) + copyto! (similar (parent (B)), B)
862
887
863
- - (A:: UpperTriangular , B:: UpperTriangular ) = UpperTriangular (A. data - B. data)
864
- - (A:: LowerTriangular , B:: LowerTriangular ) = LowerTriangular (A. data - B. data)
865
- - (A:: UpperTriangular , B:: UnitUpperTriangular ) = UpperTriangular (A. data - triu (B. data, 1 ) - I)
866
- - (A:: LowerTriangular , B:: UnitLowerTriangular ) = LowerTriangular (A. data - tril (B. data, - 1 ) - I)
867
- - (A:: UnitUpperTriangular , B:: UpperTriangular ) = UpperTriangular (triu (A. data, 1 ) - B. data + I)
868
- - (A:: UnitLowerTriangular , B:: LowerTriangular ) = LowerTriangular (tril (A. data, - 1 ) - B. data + I)
869
- - (A:: UnitUpperTriangular , B:: UnitUpperTriangular ) = UpperTriangular (triu (A. data, 1 ) - triu (B. data, 1 ))
870
- - (A:: UnitLowerTriangular , B:: UnitLowerTriangular ) = LowerTriangular (tril (A. data, - 1 ) - tril (B. data, - 1 ))
871
- - (A:: AbstractTriangular , B:: AbstractTriangular ) = copyto! (similar (parent (A)), A) - copyto! (similar (parent (B)), B)
872
-
873
- # use broadcasting if the parents are strided, where we loop only over the triangular part
874
- for op in (:+ , :- )
875
- for TM1 in (:LowerTriangular , :UnitLowerTriangular ), TM2 in (:LowerTriangular , :UnitLowerTriangular )
876
- @eval $ op (A:: $TM1{<:Any, <:StridedMaybeAdjOrTransMat} , B:: $TM2{<:Any, <:StridedMaybeAdjOrTransMat} ) = broadcast ($ op, A, B)
877
- end
878
- for TM1 in (:UpperTriangular , :UnitUpperTriangular ), TM2 in (:UpperTriangular , :UnitUpperTriangular )
879
- @eval $ op (A:: $TM1{<:Any, <:StridedMaybeAdjOrTransMat} , B:: $TM2{<:Any, <:StridedMaybeAdjOrTransMat} ) = broadcast ($ op, A, B)
880
- end
888
+ function - (A:: UpperTriangular , B:: UpperTriangular )
889
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
890
+ UpperTriangular (A. data - B. data)
891
+ end
892
+ function - (A:: LowerTriangular , B:: LowerTriangular )
893
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
894
+ LowerTriangular (A. data - B. data)
895
+ end
896
+ function - (A:: UpperTriangular , B:: UnitUpperTriangular )
897
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
898
+ UpperTriangular (A. data - triu (B. data, 1 ) - I)
899
+ end
900
+ function - (A:: LowerTriangular , B:: UnitLowerTriangular )
901
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
902
+ LowerTriangular (A. data - tril (B. data, - 1 ) - I)
881
903
end
904
+ function - (A:: UnitUpperTriangular , B:: UpperTriangular )
905
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
906
+ UpperTriangular (triu (A. data, 1 ) - B. data + I)
907
+ end
908
+ function - (A:: UnitLowerTriangular , B:: LowerTriangular )
909
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
910
+ LowerTriangular (tril (A. data, - 1 ) - B. data + I)
911
+ end
912
+ function - (A:: UnitUpperTriangular , B:: UnitUpperTriangular )
913
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
914
+ UpperTriangular (triu (A. data, 1 ) - triu (B. data, 1 ))
915
+ end
916
+ function - (A:: UnitLowerTriangular , B:: UnitLowerTriangular )
917
+ (parent (A) isa StridedMatrix || parent (B) isa StridedMatrix) && return A .- B
918
+ LowerTriangular (tril (A. data, - 1 ) - tril (B. data, - 1 ))
919
+ end
920
+ - (A:: AbstractTriangular , B:: AbstractTriangular ) = copyto! (similar (parent (A)), A) - copyto! (similar (parent (B)), B)
882
921
883
922
function kron (A:: UpperTriangular{<:Number,<:StridedMaybeAdjOrTransMat} , B:: UpperTriangular{<:Number,<:StridedMaybeAdjOrTransMat} )
884
923
C = UpperTriangular (Matrix {promote_op(*, eltype(A), eltype(B))} (undef, _kronsize (A, B)))
0 commit comments