1
1
# Matrix: create matrix representation of LinearMap
2
- function Base. Matrix (A:: LinearMap )
2
+ function Base. Matrix {T} (A:: LinearMap ) where {T}
3
3
M, N = size (A)
4
- T = eltype (A)
5
4
mat = Matrix {T} (undef, (M, N))
6
5
v = fill (zero (T), N)
7
6
@inbounds for i in 1 : N
@@ -11,8 +10,9 @@ function Base.Matrix(A::LinearMap)
11
10
end
12
11
return mat
13
12
end
13
+ Base. Matrix (A:: LinearMap{T} ) where {T} = Matrix {T} (A)
14
14
Base. Array (A:: LinearMap ) = Matrix (A)
15
- Base. convert (:: Type{Matrix } , A:: LinearMap ) = Matrix (A)
15
+ Base. convert (:: Type{T } , A:: LinearMap ) where {T <: Matrix } = T (A)
16
16
Base. convert (:: Type{Array} , A:: LinearMap ) = convert (Matrix, A)
17
17
Base. convert (:: Type{AbstractMatrix} , A:: LinearMap ) = convert (Matrix, A)
18
18
Base. convert (:: Type{AbstractArray} , A:: LinearMap ) = convert (AbstractMatrix, A)
@@ -42,21 +42,22 @@ function SparseArrays.sparse(A::LinearMap{T}) where {T}
42
42
return SparseMatrixCSC (M, N, colptr, rowind, nzval)
43
43
end
44
44
Base. convert (:: Type{SparseMatrixCSC} , A:: LinearMap ) = sparse (A)
45
+ SparseArrays. SparseMatrixCSC (A:: LinearMap ) = sparse (A)
45
46
46
47
# special cases
47
48
48
49
# ScaledMap
49
- Base. Matrix (A:: ScaledMap{<:Any,<:Any,<:MatrixMap} ) = convert (Matrix, A. λ* A. lmap. lmap)
50
+ Base. Matrix {T} (A:: ScaledMap{<:Any,<:Any,<:MatrixMap} ) where {T} = convert (Matrix{T} , A. λ* A. lmap. lmap)
50
51
SparseArrays. sparse (A:: ScaledMap{<:Any,<:Any,<:MatrixMap} ) = convert (SparseMatrixCSC, A. λ* A. lmap. lmap)
51
52
52
53
# UniformScalingMap
53
- Base. Matrix (J:: UniformScalingMap ) = Matrix (J. λ* I, size (J))
54
- Base. convert (:: Type{AbstractMatrix} , J:: UniformScalingMap ) = Diagonal (fill (J. λ, size (J, 1 ) ))
54
+ Base. Matrix {T} (J:: UniformScalingMap ) where {T} = Matrix {T} (J. λ* I, size (J))
55
+ Base. convert (:: Type{AbstractMatrix} , J:: UniformScalingMap ) = Diagonal (fill (J. λ, J . M ))
55
56
56
57
# WrappedMap
57
- Base. Matrix (A:: WrappedMap ) = Matrix (A. lmap)
58
+ Base. Matrix {T} (A:: WrappedMap ) where {T} = Matrix {T} (A. lmap)
59
+ Base. convert (:: Type{T} , A:: WrappedMap ) where {T<: Matrix } = convert (T, A. lmap)
58
60
Base. convert (:: Type{AbstractMatrix} , A:: WrappedMap ) = convert (AbstractMatrix, A. lmap)
59
- Base. convert (:: Type{Matrix} , A:: WrappedMap ) = convert (Matrix, A. lmap)
60
61
SparseArrays. sparse (A:: WrappedMap ) = sparse (A. lmap)
61
62
Base. convert (:: Type{SparseMatrixCSC} , A:: WrappedMap ) = convert (SparseMatrixCSC, A. lmap)
62
63
@@ -67,68 +68,90 @@ for (TT, T) in ((AdjointMap, adjoint), (TransposeMap, transpose))
67
68
end
68
69
69
70
# LinearCombination
70
- for (TT, T) in ((Type{Matrix}, Matrix), (Type{SparseMatrixCSC}, SparseMatrixCSC))
71
- @eval function Base. convert (:: $TT , ΣA:: LinearCombination{<:Any,<:Tuple{Vararg{MatrixMap}}} )
72
- maps = ΣA. maps
73
- mats = map (A-> getfield (A, :lmap ), maps)
74
- return convert ($ T, sum (mats))
75
- end
71
+ function Base. Matrix {T} (ΣA:: LinearCombination{<:Any,<:Tuple{Vararg{MatrixMap}}} ) where {T}
72
+ maps = ΣA. maps
73
+ mats = map (A-> getfield (A, :lmap ), maps)
74
+ return Matrix {T} (sum (mats))
75
+ end
76
+ function SparseArrays. sparse (ΣA:: LinearCombination{<:Any,<:Tuple{Vararg{MatrixMap}}} )
77
+ maps = ΣA. maps
78
+ mats = map (A-> getfield (A, :lmap ), maps)
79
+ return convert (SparseMatrixCSC, sum (mats))
76
80
end
77
81
78
82
# CompositeMap
79
- for (TT, T) in ((Type{Matrix}, Matrix), (Type{SparseMatrixCSC}, SparseMatrixCSC))
80
- @eval function Base. convert (:: $TT , AB:: CompositeMap{<:Any,<:Tuple{MatrixMap,MatrixMap}} )
83
+ function Base. Matrix {T} (AB:: CompositeMap{<:Any,<:Tuple{MatrixMap,LinearMap}} ) where {T}
84
+ B, A = AB. maps
85
+ require_one_based_indexing (B)
86
+ Y = Matrix {eltype(AB)} (undef, size (AB))
87
+ @views for i in 1 : size (Y, 2 )
88
+ _unsafe_mul! (Y[:, i], A, B. lmap[:, i])
89
+ end
90
+ return Y
91
+ end
92
+ for ((TA, fieldA), (TB, fieldB)) in (((MatrixMap, :lmap ), (MatrixMap, :lmap )),
93
+ ((MatrixMap, :lmap ), (UniformScalingMap, :λ )),
94
+ ((UniformScalingMap, :λ ), (MatrixMap, :lmap )))
95
+ @eval function Base. convert (:: Type{AbstractMatrix} , AB:: CompositeMap{<:Any,<:Tuple{$TB,$TA}} )
81
96
B, A = AB. maps
82
- return convert ( $ T, A . lmap * B. lmap)
97
+ return A. $ fieldA * B.$ fieldB
83
98
end
84
99
end
85
- function Base. Matrix (λA:: CompositeMap{<:Any,<:Tuple{MatrixMap,UniformScalingMap}} )
100
+ function Base. Matrix {T} (AB:: CompositeMap{<:Any,<:Tuple{MatrixMap,MatrixMap}} ) where {T}
101
+ B, A = AB. maps
102
+ return convert (Matrix{T}, A. lmap* B. lmap)
103
+ end
104
+ function SparseArrays. sparse (AB:: CompositeMap{<:Any,<:Tuple{MatrixMap,MatrixMap}} )
105
+ B, A = AB. maps
106
+ return convert (SparseMatrixCSC, A. lmap* B. lmap)
107
+ end
108
+ function Base. Matrix {T} (λA:: CompositeMap{<:Any,<:Tuple{MatrixMap,UniformScalingMap}} ) where {T}
86
109
A, J = λA. maps
87
- return convert (Matrix, J. λ* A. lmap)
110
+ return convert (Matrix{T} , J. λ* A. lmap)
88
111
end
89
112
function SparseArrays. sparse (λA:: CompositeMap{<:Any,<:Tuple{MatrixMap,UniformScalingMap}} )
90
113
A, J = λA. maps
91
114
return convert (SparseMatrixCSC, J. λ* A. lmap)
92
115
end
93
- function Base. Matrix (Aλ:: CompositeMap{<:Any,<:Tuple{UniformScalingMap,MatrixMap}} )
116
+ function Base. Matrix {T} (Aλ:: CompositeMap{<:Any,<:Tuple{UniformScalingMap,MatrixMap}} ) where {T}
94
117
J, A = Aλ. maps
95
- return convert (Matrix, A. lmap* J. λ)
118
+ return convert (Matrix{T} , A. lmap* J. λ)
96
119
end
97
120
function SparseArrays. sparse (Aλ:: CompositeMap{<:Any,<:Tuple{UniformScalingMap,MatrixMap}} )
98
121
J, A = Aλ. maps
99
122
return convert (SparseMatrixCSC, A. lmap* J. λ)
100
123
end
101
124
102
125
# BlockMap & BlockDiagonalMap
103
- Base. Matrix (A:: BlockMap ) = hvcat (A. rows, convert .(Matrix, A. maps)... )
126
+ Base. Matrix {T} (A:: BlockMap ) where {T} = hvcat (A. rows, convert .(Matrix{T} , A. maps)... )
104
127
Base. convert (:: Type{AbstractMatrix} , A:: BlockMap ) = hvcat (A. rows, convert .(AbstractMatrix, A. maps)... )
105
- function Base . convert ( :: Type{SparseMatrixCSC} , A:: BlockMap )
128
+ function SparseArrays . sparse ( A:: BlockMap )
106
129
return hvcat (
107
130
A. rows,
108
131
convert (SparseMatrixCSC, first (A. maps)),
109
132
convert .(AbstractMatrix, Base. tail (A. maps))...
110
133
)
111
134
end
112
- Base. Matrix (A:: BlockDiagonalMap ) = cat (convert .(Matrix, A. maps)... ; dims= (1 ,2 ))
135
+ Base. Matrix {T} (A:: BlockDiagonalMap ) where {T} = cat (convert .(Matrix{T} , A. maps)... ; dims= (1 ,2 ))
113
136
Base. convert (:: Type{AbstractMatrix} , A:: BlockDiagonalMap ) = sparse (A)
114
137
function SparseArrays. sparse (A:: BlockDiagonalMap )
115
138
return blockdiag (convert .(SparseMatrixCSC, A. maps)... )
116
139
end
117
140
118
141
# KroneckerMap & KroneckerSumMap
119
- Base. Matrix (A:: KroneckerMap ) = kron (convert .(Matrix, A. maps)... )
142
+ Base. Matrix {T} (A:: KroneckerMap ) where {T} = kron (convert .(Matrix{T} , A. maps)... )
120
143
Base. convert (:: Type{AbstractMatrix} , A:: KroneckerMap ) = kron (convert .(AbstractMatrix, A. maps)... )
121
144
function SparseArrays. sparse (A:: KroneckerMap )
122
145
return kron (
123
146
convert (SparseMatrixCSC, first (A. maps)),
124
147
convert .(AbstractMatrix, Base. tail (A. maps))...
125
148
)
126
149
end
127
- function Base. Matrix (L:: KroneckerSumMap )
150
+ function Base. Matrix {T} (L:: KroneckerSumMap ) where {T}
128
151
A, B = L. maps
129
152
IA = Diagonal (ones (Bool, size (A, 1 )))
130
153
IB = Diagonal (ones (Bool, size (B, 1 )))
131
- return kron (Matrix (A), IB) + kron (IA, Matrix (B))
154
+ return kron (Matrix {T} (A), IB) + kron (IA, Matrix {T} (B))
132
155
end
133
156
function Base. convert (:: Type{AbstractMatrix} , L:: KroneckerSumMap )
134
157
A, B = L. maps
0 commit comments