1
-
2
-
3
-
4
-
5
1
# #interlace block operators
6
2
function isboundaryrow (A,k)
7
3
for j= 1 : size (A,2 )
@@ -19,12 +15,12 @@ domainscompatible(A::AbstractMatrix{T}) where {T<:Operator} = domainscompatible(
19
15
20
16
function spacescompatible (A:: AbstractMatrix{T} ) where T<: Operator
21
17
for k= 1 : size (A,1 )
22
- if ! spacescompatible (map (rangespace,A[k,:]))
18
+ if ! spacescompatible (map (rangespace, @view A[k,:]))
23
19
return false
24
20
end
25
21
end
26
22
for k= 1 : size (A,2 )
27
- if ! spacescompatible (map (domainspace,A[:,k]))
23
+ if ! spacescompatible (map (domainspace, @view A[:,k]))
28
24
return false
29
25
end
30
26
end
@@ -38,7 +34,7 @@ function domainspace(A::AbstractMatrix{T}) where T<:Operator
38
34
error (" Cannot construct domainspace for $A as spaces are not compatible" )
39
35
end
40
36
41
- spl= map (domainspace,A[1 ,:])
37
+ spl= map (domainspace, @view A[1 ,:])
42
38
Space (spl)
43
39
end
44
40
@@ -47,7 +43,7 @@ function rangespace(A::VectorOrTupleOfOp)
47
43
error (" Cannot construct rangespace for $A as domain spaces are not compatible" )
48
44
end
49
45
spl= map (rangespace, A)
50
- ArraySpace (_convert_vector_promotetypes (spl), first (spl))
46
+ ArraySpace (convert_vector_or_svector_promotetypes (spl), first (spl))
51
47
end
52
48
53
49
promotespaces (A:: AbstractMatrix{<:Operator} ) = promotespaces (Matrix (A))
@@ -56,16 +52,16 @@ function promotespaces(A::Matrix{<:Operator})
56
52
isempty (A) && return A
57
53
ret = similar (A) # TODO : promote might have different Array type
58
54
for j= 1 : size (A,2 )
59
- ret[:,j] = promotedomainspace (A[:,j])
55
+ ret[:,j] = promotedomainspace (@view A[:,j])
60
56
end
61
57
for k= 1 : size (A,1 )
62
- ret[k,:] = promoterangespace (ret[k,:])
58
+ ret[k,:] = promoterangespace (@view ret[k,:])
63
59
end
64
60
65
61
# do a second loop as spaces might have been inferred
66
62
# during range space
67
63
for j= 1 : size (A,2 )
68
- ret[:,j] = promotedomainspace (ret[:,j])
64
+ ret[:,j] = promotedomainspace (@view ret[:,j])
69
65
end
70
66
ret
71
67
end
152
148
function InterlaceOperator (opsin:: AbstractMatrix{<:Operator} ,:: Type{DS} ,:: Type{RS} ) where {DS<: Space ,RS<: Space }
153
149
isempty (opsin) && throw (ArgumentError (" Cannot create InterlaceOperator from empty Matrix" ))
154
150
ops= promotespaces (opsin)
155
- InterlaceOperator (ops,DS (components (domainspace (ops))),RS (rangespace (ops[:,1 ]). spaces))
151
+ InterlaceOperator (ops,DS (components (domainspace (ops))),RS (rangespace (@view ops[:,1 ]). spaces))
156
152
end
157
153
158
154
@@ -178,13 +174,6 @@ InterlaceOperator(opsin::AbstractMatrix{<:Operator},::Type{DS}) where {DS<:Space
178
174
InterlaceOperator (opsin:: AbstractMatrix ,S... ) =
179
175
InterlaceOperator (Matrix {Operator{promote_eltypeof(opsin)}} (promotespaces (opsin)),S... )
180
176
181
- _convert_vector_promotetypes (v:: AbstractVector ) = convert_vector (v)
182
- _uniontypes_svector (t) = SVector {length(t), mapfoldl(typeof, (x,y)->Union{x,y}, t)} (t)
183
- _convert_vector_promotetypes (t:: NTuple{2,Any} ) = _uniontypes_svector (t)
184
- _convert_vector_promotetypes (t:: NTuple{3,Any} ) = _uniontypes_svector (t)
185
- _convert_vector_promotetypes (t:: NTuple{4,Any} ) = _uniontypes_svector (t)
186
- _convert_vector_promotetypes (t:: Tuple ) = SVector {length(t), mapreduce(typeof, typejoin, t)} (t)
187
-
188
177
function InterlaceOperator (opsin:: AbstractVector{<:Operator} )
189
178
ops = convert_vector (promotedomainspace (opsin))
190
179
InterlaceOperator (ops, domainspace (first (ops)), rangespace (ops))
0 commit comments