11struct FillMap{T} <: LinearMaps.LinearMap{T}
22 λ:: T
33 size:: Dims{2}
4+ function FillMap (λ:: T , dims) where {T}
5+ all (d -> d >= 0 , dims) || throw (ArgumentError (" dims of FillMap must be non-negative" ))
6+ promote_type (T, typeof (λ)) == T || throw (InexactError ())
7+ return new {T} (λ, dims)
8+ end
49end
510
611# properties
712Base. size (A:: FillMap ) = A. size
813MulStyle (A:: FillMap ) = FiveArg ()
914LinearAlgebra. issymmetric (A:: FillMap ) = A. size[1 ] == A. size[2 ]
1015LinearAlgebra. ishermitian (A:: FillMap ) = isreal (A) && A. size[1 ] == A. size[2 ]
11- LinearAlgebra. isposdef (A:: FillMap ) = false
16+ LinearAlgebra. isposdef (A:: FillMap ) = ( size (A, 1 ) == size (A, 2 ) == 1 && isposdef (A . λ))
1217Base.:(== )(A:: FillMap , B:: FillMap ) = A. λ == B. λ && A. size == B. size
1318
14- LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (A. λ), revert (A. size))
15- LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (A. λ), revert (A. size))
19+ LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (A. λ), reverse (A. size))
20+ LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (A. λ), reverse (A. size))
21+
22+ function Base.:(* )(A:: FillMap , x:: AbstractVector )
23+ T = typeof (oneunit (eltype (A)) * (zero (eltype (x)) + zero (eltype (x))))
24+ return fill (iszero (A. λ) ? zero (T) : A. λ* sum (x), A. size[1 ])
25+ end
1626
1727function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
1828 return fill! (y, iszero (A. λ) ? zero (eltype (y)) : A. λ* sum (x))
@@ -31,13 +41,16 @@ function _unsafe_mul!(y::AbstractVecOrMat, A::FillMap, x::AbstractVector, α::Nu
3141 else
3242 y .= y .* β .+ temp
3343 end
44+ end
3445 return y
3546end
3647
3748Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. λ + B. λ, A. size) : throw (DimensionMismatch ())
3849Base.:(- )(A:: FillMap ) = FillMap (- A. λ, A. size)
3950Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ * A. λ, size (A))
4051Base.:(* )(A:: FillMap , λ:: Number ) = FillMap (A. λ * λ, size (A))
52+ Base.:(* )(λ:: RealOrComplex , A:: FillMap ) = FillMap (λ * A. λ, size (A))
53+ Base.:(* )(A:: FillMap , λ:: RealOrComplex ) = FillMap (A. λ * λ, size (A))
4154
4255function Base.:(* )(A:: FillMap , B:: FillMap )
4356 mA, nA = size (A)
0 commit comments