1
1
struct FillMap{T} <: LinearMaps.LinearMap{T}
2
2
λ:: T
3
3
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
4
9
end
5
10
6
11
# properties
7
12
Base. size (A:: FillMap ) = A. size
8
13
MulStyle (A:: FillMap ) = FiveArg ()
9
14
LinearAlgebra. issymmetric (A:: FillMap ) = A. size[1 ] == A. size[2 ]
10
15
LinearAlgebra. 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 . λ))
12
17
Base.:(== )(A:: FillMap , B:: FillMap ) = A. λ == B. λ && A. size == B. size
13
18
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
16
26
17
27
function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
18
28
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
31
41
else
32
42
y .= y .* β .+ temp
33
43
end
44
+ end
34
45
return y
35
46
end
36
47
37
48
Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. λ + B. λ, A. size) : throw (DimensionMismatch ())
38
49
Base.:(- )(A:: FillMap ) = FillMap (- A. λ, A. size)
39
50
Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ * A. λ, size (A))
40
51
Base.:(* )(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))
41
54
42
55
function Base.:(* )(A:: FillMap , B:: FillMap )
43
56
mA, nA = size (A)
0 commit comments