Skip to content

Commit 7e11b5e

Browse files
authored
Add AbstractArray conversions for AbstractQ (#1470)
1 parent 52c41f7 commit 7e11b5e

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

src/abstractq.jl

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ convert(::Type{AbstractQ{T}}, adjQ::AdjointQ) where {T} = convert(AbstractQ{T},
4242

4343
# ... to matrix
4444
Matrix{T}(Q::AbstractQ) where {T} = convert(Matrix{T}, Q*I) # generic fallback, yields square matrix
45-
Matrix{T}(adjQ::AdjointQ{S}) where {T,S} = convert(Matrix{T}, lmul!(adjQ, Matrix{S}(I, size(adjQ))))
4645
Matrix(Q::AbstractQ{T}) where {T} = Matrix{T}(Q)
4746
Array{T}(Q::AbstractQ) where {T} = Matrix{T}(Q)
4847
Array(Q::AbstractQ) = Matrix(Q)
48+
AbstractMatrix(Q::AbstractQ) = Q*I
49+
AbstractArray(Q::AbstractQ) = AbstractMatrix(Q)
50+
AbstractMatrix{T}(Q::AbstractQ) where {T} = Matrix{T}(Q)
51+
AbstractArray{T}(Q::AbstractQ) where {T} = AbstractMatrix{T}(Q)
4952
convert(::Type{T}, Q::AbstractQ) where {T<:AbstractArray} = T(Q)
5053
# legacy
5154
@deprecate(convert(::Type{AbstractMatrix{T}}, Q::AbstractQ) where {T},
@@ -172,10 +175,10 @@ qsize_check(Q::AbstractQ, P::AbstractQ) =
172175
# mimic the AbstractArray fallback
173176
*(Q::AbstractQ{<:Number}) = Q
174177

175-
(*)(Q::AbstractQ, J::UniformScaling) = Q*J.λ
176-
function (*)(Q::AbstractQ, b::Number)
177-
T = promote_type(eltype(Q), typeof(b))
178-
lmul!(convert(AbstractQ{T}, Q), Matrix{T}(b*I, size(Q)))
178+
(*)(Q::AbstractQ, b::Number) = Q*(b*I)
179+
function (*)(Q::AbstractQ, J::UniformScaling)
180+
T = promote_type(eltype(Q), eltype(J))
181+
lmul!(convert(AbstractQ{T}, Q), Matrix{T}(J, size(Q)))
179182
end
180183
function (*)(Q::AbstractQ, B::AbstractVector)
181184
T = promote_type(eltype(Q), eltype(B))
@@ -188,10 +191,10 @@ function (*)(Q::AbstractQ, B::AbstractMatrix)
188191
mul!(similar(B, T, (size(Q, 1), size(B, 2))), convert(AbstractQ{T}, Q), B)
189192
end
190193

191-
(*)(J::UniformScaling, Q::AbstractQ) = J.λ*Q
192-
function (*)(a::Number, Q::AbstractQ)
193-
T = promote_type(typeof(a), eltype(Q))
194-
rmul!(Matrix{T}(a*I, size(Q)), convert(AbstractQ{T}, Q))
194+
(*)(a::Number, Q::AbstractQ) = (a*I)*Q
195+
function (*)(J::UniformScaling, Q::AbstractQ)
196+
T = promote_type(eltype(J), eltype(Q))
197+
rmul!(Matrix{T}(J, size(Q)), convert(AbstractQ{T}, Q))
195198
end
196199
function (*)(A::AbstractVector, Q::AbstractQ)
197200
T = promote_type(eltype(A), eltype(Q))

test/abstractq.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ n = 5
6868
end
6969
@test convert(Matrix, Q) Matrix(Q) Q[:,:] copyto!(zeros(T, size(Q)), Q) Q.Q*I
7070
@test convert(Matrix, Q') Matrix(Q') (Q')[:,:] copyto!(zeros(T, size(Q)), Q') Q.Q'*I
71+
@test AbstractMatrix(Q) AbstractArray(Q) AbstractMatrix{T}(Q) AbstractArray{T}(Q)
7172
@test Q[1,:] == Q.Q[1,:] == view(Q, 1, :)
7273
@test Q[:,1] == Q.Q[:,1] == view(Q, :, 1)
7374
@test Q[1,1] == Q.Q[1,1]

0 commit comments

Comments
 (0)