1
1
struct FillMap{T} <: LinearMaps.LinearMap{T}
2
- value :: T
2
+ λ :: T
3
3
size:: Dims{2}
4
4
end
5
5
@@ -9,51 +9,39 @@ MulStyle(A::FillMap) = FiveArg()
9
9
LinearAlgebra. issymmetric (A:: FillMap ) = A. size[1 ] == A. size[2 ]
10
10
LinearAlgebra. ishermitian (A:: FillMap ) = isreal (A) && A. size[1 ] == A. size[2 ]
11
11
LinearAlgebra. isposdef (A:: FillMap ) = false
12
- Base.:(== )(A:: FillMap , B:: FillMap ) = A. value == B. value && A. size == B. size
12
+ Base.:(== )(A:: FillMap , B:: FillMap ) = A. λ == B. λ && A. size == B. size
13
13
14
- LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (value ), revert (A. size))
15
- LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (value ), revert (A. size))
14
+ LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (A . λ ), revert (A. size))
15
+ LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (A . λ ), revert (A. size))
16
16
17
- function LinearMaps. A_mul_B! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
18
- checkbounds (y, A, x)
19
- if iszero (A. value)
20
- fill! (y, zero (eltype (y)))
21
- else
22
- temp = sum (x)
23
- fill! (y, A. value* temp)
24
- end
25
- return y
17
+ function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
18
+ return fill! (y, iszero (A. λ) ? zero (eltype (y)) : A. λ* sum (x))
26
19
end
27
20
28
- Base. @propagate_inbounds function mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector , α:: Number , β:: Number )
29
- @boundscheck checkbounds (y, A, x)
21
+ function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector , α:: Number , β:: Number )
30
22
if iszero (α)
31
23
! isone (β) && rmul! (y, β)
32
24
return y
33
25
else
34
- temp = sum (x)* α
26
+ temp = A . λ * sum (x) * α
35
27
if iszero (β)
36
- y .+ = temp
28
+ y .= temp
37
29
elseif isone (β)
38
- y .= y .+ temp
30
+ y .+ = temp
39
31
else
40
- y .= y.* β .+ temp
32
+ y .= y .* β .+ temp
41
33
end
42
34
return y
43
35
end
44
36
45
- Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. value + B. value, A. size) : throw (DimensionMismatch ())
46
- Base.:(- )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. value - B. value, A. size) : throw (DimensionMismatch ())
47
- Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ* A. value, size (A))
48
- Base.:(* )(A:: FillMap , λ:: Number ) = FillMap (A. value* λ, size (A))
49
- Base.:(* )(J:: UniformScaling , A:: FillMap ) = FillMap (J. λ* A. value, size (A))
50
- Base.:(* )(A:: FillMap , J:: UniformScaling ) = FillMap (A. value* J. λ, size (A))
51
- Base.:(* )(J:: LinearMaps.UniformScalingMap , A:: FillMap ) = FillMap (J. λ* A. value, size (A))
52
- Base.:(* )(A:: FillMap , J:: LinearMaps.UniformScalingMap ) = FillMap (A. value* J. λ, size (A))
37
+ Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. λ + B. λ, A. size) : throw (DimensionMismatch ())
38
+ Base.:(- )(A:: FillMap ) = FillMap (- A. λ, A. size)
39
+ Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ * A. λ, size (A))
40
+ Base.:(* )(A:: FillMap , λ:: Number ) = FillMap (A. λ * λ, size (A))
53
41
54
42
function Base.:(* )(A:: FillMap , B:: FillMap )
55
43
mA, nA = size (A)
56
44
mB, nB = size (B)
57
45
nA != mB && throw (DimensionMismatch ())
58
- return FillMap (A. value * B. value * nA, (mA, nB))
46
+ return FillMap (A. λ * B. λ * nA, (mA, nB))
59
47
end
0 commit comments