@@ -19,20 +19,30 @@ LinearAlgebra.transpose(A::UniformScalingMap) = A
19
19
LinearAlgebra. adjoint (A:: UniformScalingMap ) = UniformScalingMap (conj (A. λ), size (A))
20
20
21
21
# multiplication with vector
22
+ Base.:(* )(A:: UniformScalingMap , x:: AbstractVector ) =
23
+ length (x) == A. M ? A. λ * x : throw (DimensionMismatch (" A_mul_B!" ))
24
+
22
25
# call of LinearAlgebra.generic_mul! since order of arguments in mul! in stdlib/LinearAlgebra/src/generic.jl
23
26
# TODO : either leave it as is or use mul! (and lower bound on version) once fixed in LinearAlgebra
24
- A_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector ) =
25
- (length (x) == length (y) == A. M ? LinearAlgebra. generic_mul! (y, A. λ, x) : throw (DimensionMismatch (" A_mul_B!" )))
26
- Base.:(* )(A:: UniformScalingMap , x:: AbstractVector ) = A. λ * x
27
-
28
- At_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector ) =
29
- (length (x) == length (y) == A. M ? LinearAlgebra. generic_mul! (y, A. λ, x) : throw (DimensionMismatch (" At_mul_B!" )))
30
-
31
- Ac_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector ) =
32
- (length (x) == length (y) == A. M ? LinearAlgebra. generic_mul! (y, conj (A. λ), x) : throw (DimensionMismatch (" Ac_mul_B!" )))
27
+ function A_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector )
28
+ (length (x) == length (y) == A. M || throw (DimensionMismatch (" A_mul_B!" )))
29
+ if iszero (A. λ)
30
+ return fill! (y, 0 )
31
+ elseif isone (A. λ)
32
+ return copyto! (y, x)
33
+ else
34
+ return LinearAlgebra. generic_mul! (y, A. λ, x)
35
+ end
36
+ end
37
+ At_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector ) = A_mul_B! (y, transpose (A), x)
38
+ Ac_mul_B! (y:: AbstractVector , A:: UniformScalingMap , x:: AbstractVector ) = A_mul_B! (y, adjoint (A), x)
33
39
34
40
# combine LinearMap and UniformScaling objects in linear combinations
35
- Base.:(+ )(A1:: LinearMap , A2:: UniformScaling{T} ) where {T} = A1 + UniformScalingMap {T} (A2[1 ,1 ], size (A1, 1 ))
36
- Base.:(+ )(A1:: UniformScaling{T} , A2:: LinearMap ) where {T} = UniformScalingMap {T} (A1[1 ,1 ], size (A2, 1 )) + A2
37
- Base.:(- )(A1:: LinearMap , A2:: UniformScaling{T} ) where {T} = A1 - UniformScalingMap {T} (A2[1 ,1 ], size (A1, 1 ))
38
- Base.:(- )(A1:: UniformScaling{T} , A2:: LinearMap ) where {T} = UniformScalingMap {T} (A1[1 ,1 ], size (A2, 1 )) - A2
41
+ Base.:(+ )(A1:: LinearMap , A2:: UniformScaling ) =
42
+ A1 + UniformScalingMap (convert (promote_type (eltype (A1), eltype (A2)), A2. λ), size (A1, 1 ))
43
+ Base.:(+ )(A1:: UniformScaling , A2:: LinearMap ) =
44
+ UniformScalingMap (convert (promote_type (eltype (A1), eltype (A2)), A1. λ), size (A2, 1 )) + A2
45
+ Base.:(- )(A1:: LinearMap , A2:: UniformScaling ) =
46
+ A1 - UniformScalingMap (convert (promote_type (eltype (A1), eltype (A2)), A2. λ), size (A1, 1 ))
47
+ Base.:(- )(A1:: UniformScaling , A2:: LinearMap ) =
48
+ UniformScalingMap (convert (promote_type (eltype (A1), eltype (A2)), A1. λ), size (A2, 1 )) - A2
0 commit comments