Skip to content

Commit c892f47

Browse files
committed
Specialize transpose/adjoint for reshaped Transpose/Adjoint
1 parent 414478c commit c892f47

File tree

3 files changed

+17
-10
lines changed

3 files changed

+17
-10
lines changed

src/adjtrans.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,3 +552,16 @@ conj(A::Adjoint) = transpose(A.parent)
552552
function Base.replace_in_print_matrix(A::AdjOrTrans,i::Integer,j::Integer,s::AbstractString)
553553
Base.replace_in_print_matrix(parent(A), j, i, s)
554554
end
555+
556+
# Special adjoint/transpose methods for Adjoint/Transpose that have been reshaped as a vector
557+
# these are used in transposing banded matrices by forwarding the operation to the bands
558+
# the permutedims converts a n-element vector to an 1xn matrix
559+
transpose(A::Base.ReshapedArray{<:Any,1,<:TransposeAbsVec}) = permutedims(transpose(parent(A)))
560+
adjoint(A::Base.ReshapedArray{<:Any,1,<:AdjointAbsVec}) = permutedims(adjoint(parent(A)))
561+
562+
# compute vec(transpose(A)), but avoid an allocating reshape if possible
563+
_vectranspose(A::AbstractVector) = vec(transpose(A))
564+
_vectranspose(A::Base.ReshapedArray{<:Any,1,<:TransposeAbsVec}) = transpose(parent(A))
565+
# compute vec(adjoint(A)), but avoid an allocating reshape if possible
566+
_vecadjoint(A::AbstractVector) = vec(adjoint(A))
567+
_vecadjoint(A::Base.ReshapedArray{<:Any,1,<:AdjointAbsVec}) = adjoint(parent(A))

src/bidiag.jl

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -308,12 +308,8 @@ for func in (:conj, :copy, :real, :imag)
308308
end
309309
isreal(M::Bidiagonal) = isreal(M.dv) && isreal(M.ev)
310310

311-
adjoint(B::Bidiagonal) = Bidiagonal(vec(adjoint(B.dv)), vec(adjoint(B.ev)), B.uplo == 'U' ? :L : :U)
312-
adjoint(B::Bidiagonal{<:Any, <:Base.ReshapedArray{<:Any,1,<:AdjointAbsVec}}) =
313-
Bidiagonal(adjoint(parent(B.dv)), adjoint(parent(B.ev)), B.uplo == 'U' ? :L : :U)
314-
transpose(B::Bidiagonal) = Bidiagonal(vec(transpose(B.dv)), vec(transpose(B.ev)), B.uplo == 'U' ? :L : :U)
315-
transpose(B::Bidiagonal{<:Any, <:Base.ReshapedArray{<:Any,1,<:TransposeAbsVec}}) =
316-
Bidiagonal(transpose(parent(B.dv)), transpose(parent(B.ev)), B.uplo == 'U' ? :L : :U)
311+
adjoint(B::Bidiagonal) = Bidiagonal(_vecadjoint(B.dv), _vecadjoint(B.ev), B.uplo == 'U' ? :L : :U)
312+
transpose(B::Bidiagonal) = Bidiagonal(_vectranspose(B.dv), _vectranspose(B.ev), B.uplo == 'U' ? :L : :U)
317313
permutedims(B::Bidiagonal) = Bidiagonal(B.dv, B.ev, B.uplo == 'U' ? 'L' : 'U')
318314
function permutedims(B::Bidiagonal, perm)
319315
Base.checkdims_perm(axes(B), axes(B), perm)

src/diagonal.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -906,10 +906,8 @@ end
906906
end
907907

908908
conj(D::Diagonal) = Diagonal(conj(D.diag))
909-
transpose(D::Diagonal) = Diagonal(vec(transpose(D.diag)))
910-
transpose(D::Diagonal{<:Any,<:Base.ReshapedArray{<:Any,1,<:TransposeAbsVec}}) = Diagonal(transpose(parent(D.diag)))
911-
adjoint(D::Diagonal) = Diagonal(vec(adjoint(D.diag)))
912-
adjoint(D::Diagonal{<:Any,<:Base.ReshapedArray{<:Any,1,<:AdjointAbsVec}}) = Diagonal(adjoint(parent(D.diag)))
909+
transpose(D::Diagonal) = Diagonal(_vectranspose(D.diag))
910+
adjoint(D::Diagonal) = Diagonal(_vecadjoint(D.diag))
913911
permutedims(D::Diagonal) = D
914912
permutedims(D::Diagonal, perm) = (Base.checkdims_perm(axes(D), axes(D), perm); D)
915913

0 commit comments

Comments
 (0)