Skip to content

Commit 4a3dbf8

Browse files
authored
un-revert "Simplify some views of Adjoint matrices" (#1122)
This copies JuliaLang/julia#43719 to the new LinearAlgebra.jl repository (partly to see if this all works!) The original PR was JuliaLang/julia#39467
1 parent 7b34d81 commit 4a3dbf8

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/adjtrans.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,20 @@ parent(A::AdjOrTrans) = A.parent
382382
vec(v::TransposeAbsVec{<:Number}) = parent(v)
383383
vec(v::AdjointAbsVec{<:Real}) = parent(v)
384384

385+
Base.reshape(v::TransposeAbsVec{<:Number}, ::Val{1}) = parent(v)
386+
Base.reshape(v::AdjointAbsVec{<:Real}, ::Val{1}) = parent(v)
387+
388+
# these make eachrow(A') produce simpler views
389+
@inline Base.unsafe_view(A::Transpose{<:Number, <:AbstractMatrix}, i::Integer, j::AbstractArray) =
390+
Base.unsafe_view(parent(A), j, i)
391+
@inline Base.unsafe_view(A::Transpose{<:Number, <:AbstractMatrix}, i::AbstractArray, j::Integer) =
392+
Base.unsafe_view(parent(A), j, i)
393+
394+
@inline Base.unsafe_view(A::Adjoint{<:Real, <:AbstractMatrix}, i::Integer, j::AbstractArray) =
395+
Base.unsafe_view(parent(A), j, i)
396+
@inline Base.unsafe_view(A::Adjoint{<:Real, <:AbstractMatrix}, i::AbstractArray, j::Integer) =
397+
Base.unsafe_view(parent(A), j, i)
398+
385399
### concatenation
386400
# preserve Adjoint/Transpose wrapper around vectors
387401
# to retain the associated semantics post-concatenation

test/adjtrans.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,35 @@ end
308308
@test vec(adjoint(mvec))[1] == adjoint(mvec[1])
309309
end
310310

311+
@testset "Adjoint and Transpose view methods" begin
312+
intvec, intmat = [1, 2], [1 2 3; 4 5 6]
313+
# overload of reshape(v, Val(1)) simplifies views of row vectors:
314+
@test view(adjoint(intvec), 1:2) isa SubArray{Int, 1, Vector{Int}}
315+
@test view(transpose(intvec), 1:2) isa SubArray{Int, 1, Vector{Int}}
316+
cvec = [1, 2im, 3, 4im]
317+
@test view(transpose(cvec), 2:3) === view(cvec, 2:3)
318+
@test view(adjoint(cvec), 2:3) == conj(view(cvec, 2:3))
319+
320+
# vector slices of transposed matrices are simplified:
321+
@test view(adjoint(intmat), 1, :) isa SubArray{Int, 1, Matrix{Int}}
322+
@test view(transpose(intmat), 1, :) isa SubArray{Int, 1, Matrix{Int}}
323+
@test view(adjoint(intmat), 1, :) == permutedims(intmat)[1, :]
324+
@test view(transpose(intmat), 1:1, :) == permutedims(intmat)[1:1, :] # not simplified
325+
@test view(adjoint(intmat), :, 2) isa SubArray{Int, 1, Matrix{Int}}
326+
@test view(transpose(intmat), :, 2) isa SubArray{Int, 1, Matrix{Int}}
327+
@test view(adjoint(intmat), :, 2) == permutedims(intmat)[:, 2]
328+
@test view(transpose(intmat), :, 2:2) == permutedims(intmat)[:, 2:2] # not simplified
329+
cmat = [1 2im 3; 4im 5 6im]
330+
@test view(transpose(cmat), 1, :) isa SubArray{Complex{Int}, 1, Matrix{Complex{Int}}}
331+
@test view(transpose(cmat), :, 2) == cmat[2, :]
332+
@test view(adjoint(cmat), :, 2) == conj(cmat[2, :]) # not simplified
333+
334+
# bounds checks happen before this
335+
@test_throws BoundsError view(adjoint(intvec), 0:3)
336+
@test_throws BoundsError view(transpose(cvec), 0:3)
337+
@test_throws BoundsError view(adjoint(intmat), :, 3)
338+
end
339+
311340
@testset "horizontal concatenation of Adjoint/Transpose-wrapped vectors and Numbers" begin
312341
# horizontal concatenation of Adjoint/Transpose-wrapped vectors and Numbers
313342
# should preserve the Adjoint/Transpose-wrapper to preserve semantics downstream

0 commit comments

Comments
 (0)