Skip to content

Commit f26ced1

Browse files
jishnubdkarrasch
authored andcommitted
Forward diagview for adjoint/transpose to parent (#1373)
After this, ```julia julia> B = reshape([1:9;], 3, 3) 3×3 Matrix{Int64}: 1 4 7 2 5 8 3 6 9 julia> diagview(B', 1) 2-element view(::Vector{Int64}, 2:4:6) with eltype Int64: 2 6 ``` The view directly indexes into the parent, and the `adjoint` layer is removed. This also makes the view linearly indexed.
1 parent 213b31d commit f26ced1

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/adjtrans.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,3 +536,23 @@ conj(A::Adjoint) = transpose(A.parent)
536536
function Base.replace_in_print_matrix(A::AdjOrTrans,i::Integer,j::Integer,s::AbstractString)
537537
Base.replace_in_print_matrix(parent(A), j, i, s)
538538
end
539+
540+
# Special adjoint/transpose methods for Adjoint/Transpose that have been reshaped as a vector
541+
# these are used in transposing banded matrices by forwarding the operation to the bands
542+
"""
543+
_vectranspose(A::AbstractVector)::AbstractVector
544+
545+
Compute `vec(transpose(A))`, but avoid an allocating reshape if possible
546+
"""
547+
_vectranspose(A::AbstractVector) = vec(transpose(A))
548+
_vectranspose(A::Base.ReshapedArray{<:Any,1,<:TransposeAbsVec}) = transpose(parent(A))
549+
"""
550+
_vecadjoint(A::AbstractVector)::AbstractVector
551+
552+
Compute `vec(adjoint(A))`, but avoid an allocating reshape if possible
553+
"""
554+
_vecadjoint(A::AbstractVector) = vec(adjoint(A))
555+
_vecadjoint(A::Base.ReshapedArray{<:Any,1,<:AdjointAbsVec}) = adjoint(parent(A))
556+
557+
diagview(A::Transpose, k::Integer = 0) = _vectranspose(diagview(parent(A), -k))
558+
diagview(A::Adjoint, k::Integer = 0) = _vecadjoint(diagview(parent(A), -k))

test/adjtrans.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,4 +749,15 @@ end
749749
end
750750
end
751751

752+
@testset "diagview" begin
753+
for A in (rand(4, 4), rand(ComplexF64,4,4),
754+
fill([1 2; 3 4], 4, 4))
755+
for k in -3:3
756+
@test diagview(A', k) == diag(A', k)
757+
@test diagview(transpose(A), k) == diag(transpose(A), k)
758+
end
759+
@test IndexStyle(diagview(A')) == IndexLinear()
760+
end
761+
end
762+
752763
end # module TestAdjointTranspose

0 commit comments

Comments
 (0)