Skip to content

Commit f00d729

Browse files
authored
Bring back methods for addition of UniformScaling (#47824)
1 parent 495a004 commit f00d729

File tree

1 file changed

+42
-47
lines changed

1 file changed

+42
-47
lines changed

stdlib/LinearAlgebra/src/special.jl

Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ end
117117
# the off diagonal could be a different type after the operation resulting in
118118
# an error. See issue #28994
119119

120-
function (+)(A::Bidiagonal, B::Diagonal)
120+
@commutative function (+)(A::Bidiagonal, B::Diagonal)
121121
newdv = A.dv + B.diag
122122
Bidiagonal(newdv, typeof(newdv)(A.ev), A.uplo)
123123
end
@@ -127,104 +127,98 @@ function (-)(A::Bidiagonal, B::Diagonal)
127127
Bidiagonal(newdv, typeof(newdv)(A.ev), A.uplo)
128128
end
129129

130-
function (+)(A::Diagonal, B::Bidiagonal)
131-
newdv = A.diag + B.dv
132-
Bidiagonal(newdv, typeof(newdv)(B.ev), B.uplo)
133-
end
134-
135130
function (-)(A::Diagonal, B::Bidiagonal)
136-
newdv = A.diag-B.dv
131+
newdv = A.diag - B.dv
137132
Bidiagonal(newdv, typeof(newdv)(-B.ev), B.uplo)
138133
end
139134

140-
function (+)(A::Diagonal, B::SymTridiagonal)
141-
newdv = A.diag+B.dv
142-
SymTridiagonal(A.diag+B.dv, typeof(newdv)(B.ev))
135+
@commutative function (+)(A::Diagonal, B::SymTridiagonal)
136+
newdv = A.diag + B.dv
137+
SymTridiagonal(A.diag + B.dv, typeof(newdv)(B.ev))
143138
end
144139

145140
function (-)(A::Diagonal, B::SymTridiagonal)
146-
newdv = A.diag-B.dv
141+
newdv = A.diag - B.dv
147142
SymTridiagonal(newdv, typeof(newdv)(-B.ev))
148143
end
149144

150-
function (+)(A::SymTridiagonal, B::Diagonal)
151-
newdv = A.dv+B.diag
152-
SymTridiagonal(newdv, typeof(newdv)(A.ev))
153-
end
154-
155145
function (-)(A::SymTridiagonal, B::Diagonal)
156-
newdv = A.dv-B.diag
146+
newdv = A.dv - B.diag
157147
SymTridiagonal(newdv, typeof(newdv)(A.ev))
158148
end
159149

160150
# this set doesn't have the aforementioned problem
161151

162-
+(A::Tridiagonal, B::SymTridiagonal) = Tridiagonal(A.dl+_evview(B), A.d+B.dv, A.du+_evview(B))
152+
@commutative (+)(A::Tridiagonal, B::SymTridiagonal) = Tridiagonal(A.dl+_evview(B), A.d+B.dv, A.du+_evview(B))
163153
-(A::Tridiagonal, B::SymTridiagonal) = Tridiagonal(A.dl-_evview(B), A.d-B.dv, A.du-_evview(B))
164-
+(A::SymTridiagonal, B::Tridiagonal) = Tridiagonal(_evview(A)+B.dl, A.dv+B.d, _evview(A)+B.du)
165154
-(A::SymTridiagonal, B::Tridiagonal) = Tridiagonal(_evview(A)-B.dl, A.dv-B.d, _evview(A)-B.du)
166155

167-
168-
function (+)(A::Diagonal, B::Tridiagonal)
169-
newdv = A.diag+B.d
156+
@commutative function (+)(A::Diagonal, B::Tridiagonal)
157+
newdv = A.diag + B.d
170158
Tridiagonal(typeof(newdv)(B.dl), newdv, typeof(newdv)(B.du))
171159
end
172160

173161
function (-)(A::Diagonal, B::Tridiagonal)
174-
newdv = A.diag-B.d
162+
newdv = A.diag - B.d
175163
Tridiagonal(typeof(newdv)(-B.dl), newdv, typeof(newdv)(-B.du))
176164
end
177165

178-
function (+)(A::Tridiagonal, B::Diagonal)
179-
newdv = A.d+B.diag
180-
Tridiagonal(typeof(newdv)(A.dl), newdv, typeof(newdv)(A.du))
181-
end
182-
183166
function (-)(A::Tridiagonal, B::Diagonal)
184-
newdv = A.d-B.diag
167+
newdv = A.d - B.diag
185168
Tridiagonal(typeof(newdv)(A.dl), newdv, typeof(newdv)(A.du))
186169
end
187170

188-
function (+)(A::Bidiagonal, B::Tridiagonal)
189-
newdv = A.dv+B.d
171+
@commutative function (+)(A::Bidiagonal, B::Tridiagonal)
172+
newdv = A.dv + B.d
190173
Tridiagonal((A.uplo == 'U' ? (typeof(newdv)(B.dl), newdv, A.ev+B.du) : (A.ev+B.dl, newdv, typeof(newdv)(B.du)))...)
191174
end
192175

193176
function (-)(A::Bidiagonal, B::Tridiagonal)
194-
newdv = A.dv-B.d
177+
newdv = A.dv - B.d
195178
Tridiagonal((A.uplo == 'U' ? (typeof(newdv)(-B.dl), newdv, A.ev-B.du) : (A.ev-B.dl, newdv, typeof(newdv)(-B.du)))...)
196179
end
197180

198-
function (+)(A::Tridiagonal, B::Bidiagonal)
199-
newdv = A.d+B.dv
200-
Tridiagonal((B.uplo == 'U' ? (typeof(newdv)(A.dl), newdv, A.du+B.ev) : (A.dl+B.ev, newdv, typeof(newdv)(A.du)))...)
201-
end
202-
203181
function (-)(A::Tridiagonal, B::Bidiagonal)
204-
newdv = A.d-B.dv
182+
newdv = A.d - B.dv
205183
Tridiagonal((B.uplo == 'U' ? (typeof(newdv)(A.dl), newdv, A.du-B.ev) : (A.dl-B.ev, newdv, typeof(newdv)(A.du)))...)
206184
end
207185

208-
function (+)(A::Bidiagonal, B::SymTridiagonal)
209-
newdv = A.dv+B.dv
186+
@commutative function (+)(A::Bidiagonal, B::SymTridiagonal)
187+
newdv = A.dv + B.dv
210188
Tridiagonal((A.uplo == 'U' ? (typeof(newdv)(_evview(B)), A.dv+B.dv, A.ev+_evview(B)) : (A.ev+_evview(B), A.dv+B.dv, typeof(newdv)(_evview(B))))...)
211189
end
212190

213191
function (-)(A::Bidiagonal, B::SymTridiagonal)
214-
newdv = A.dv-B.dv
192+
newdv = A.dv - B.dv
215193
Tridiagonal((A.uplo == 'U' ? (typeof(newdv)(-_evview(B)), newdv, A.ev-_evview(B)) : (A.ev-_evview(B), newdv, typeof(newdv)(-_evview(B))))...)
216194
end
217195

218-
function (+)(A::SymTridiagonal, B::Bidiagonal)
219-
newdv = A.dv+B.dv
220-
Tridiagonal((B.uplo == 'U' ? (typeof(newdv)(_evview(A)), newdv, _evview(A)+B.ev) : (_evview(A)+B.ev, newdv, typeof(newdv)(_evview(A))))...)
221-
end
222-
223196
function (-)(A::SymTridiagonal, B::Bidiagonal)
224-
newdv = A.dv-B.dv
197+
newdv = A.dv - B.dv
225198
Tridiagonal((B.uplo == 'U' ? (typeof(newdv)(_evview(A)), newdv, _evview(A)-B.ev) : (_evview(A)-B.ev, newdv, typeof(newdv)(_evview(A))))...)
226199
end
227200

201+
@commutative function (+)(A::Tridiagonal, B::UniformScaling)
202+
newd = A.d .+ Ref(B)
203+
Tridiagonal(typeof(newd)(A.dl), newd, typeof(newd)(A.du))
204+
end
205+
206+
@commutative function (+)(A::SymTridiagonal, B::UniformScaling)
207+
newdv = A.dv .+ Ref(B)
208+
SymTridiagonal(newdv, typeof(newdv)(A.ev))
209+
end
210+
211+
@commutative function (+)(A::Bidiagonal, B::UniformScaling)
212+
newdv = A.dv .+ Ref(B)
213+
Bidiagonal(newdv, typeof(newdv)(A.ev), A.uplo)
214+
end
215+
216+
@commutative function (+)(A::Diagonal, B::UniformScaling)
217+
Diagonal(A.diag .+ Ref(B))
218+
end
219+
220+
# StructuredMatrix - UniformScaling = StructuredMatrix + (-UniformScaling) =>
221+
# no need to define reversed order
228222
function (-)(A::UniformScaling, B::Tridiagonal)
229223
d = Ref(A) .- B.d
230224
Tridiagonal(convert(typeof(d), -B.dl), d, convert(typeof(d), -B.du))
@@ -240,6 +234,7 @@ end
240234
function (-)(A::UniformScaling, B::Diagonal)
241235
Diagonal(Ref(A) .- B.diag)
242236
end
237+
243238
lmul!(Q::AbstractQ, B::AbstractTriangular) = lmul!(Q, full!(B))
244239
lmul!(Q::QRPackedQ, B::AbstractTriangular) = lmul!(Q, full!(B)) # disambiguation
245240
lmul!(Q::Adjoint{<:Any,<:AbstractQ}, B::AbstractTriangular) = lmul!(Q, full!(B))

0 commit comments

Comments
 (0)