From 138aeb4b0074c51c839ee5a4dba19f638046f121 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 25 Aug 2019 17:57:06 -0700 Subject: [PATCH 1/2] Use `A isa (Adjoint|Transpose)AbsVec` instead of method --- stdlib/LinearAlgebra/src/matmul.jl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stdlib/LinearAlgebra/src/matmul.jl b/stdlib/LinearAlgebra/src/matmul.jl index 0d6ac7a62e1ed..ee75e2a2d6ae8 100644 --- a/stdlib/LinearAlgebra/src/matmul.jl +++ b/stdlib/LinearAlgebra/src/matmul.jl @@ -129,10 +129,6 @@ end return generic_matvecmul!(y, 'C', A, x, MulAddMul(alpha, beta)) end -# Vector-Matrix multiplication -(*)(x::AdjointAbsVec, A::AbstractMatrix) = (A'*x')' -(*)(x::TransposeAbsVec, A::AbstractMatrix) = transpose(transpose(A)*transpose(x)) - # Matrix-matrix multiplication """ @@ -149,6 +145,11 @@ julia> [1 1; 0 1] * [1 0; 1 1] ``` """ function (*)(A::AbstractMatrix, B::AbstractMatrix) + if A isa AdjointAbsVec + return (A'*x')' + elseif A isa TransposeAbsVec + return transpose(transpose(A)*transpose(x)) + end TS = promote_op(matprod, eltype(A), eltype(B)) mul!(similar(B, TS, (size(A,1), size(B,2))), A, B) end From c7fadec33fd943d5c16afbbc7a18ca63c74b7d9f Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Sun, 25 Aug 2019 18:11:12 -0700 Subject: [PATCH 2/2] Remove obsolete ambiguity resolutions --- stdlib/LinearAlgebra/src/adjtrans.jl | 4 ---- stdlib/LinearAlgebra/src/qr.jl | 1 - stdlib/LinearAlgebra/src/triangular.jl | 5 ----- 3 files changed, 10 deletions(-) diff --git a/stdlib/LinearAlgebra/src/adjtrans.jl b/stdlib/LinearAlgebra/src/adjtrans.jl index c980e500adde0..9d26db643b1a6 100644 --- a/stdlib/LinearAlgebra/src/adjtrans.jl +++ b/stdlib/LinearAlgebra/src/adjtrans.jl @@ -251,10 +251,6 @@ function *(u::TransposeAbsVec, v::AbstractVector) end # vector * Adjoint/Transpose-vector *(u::AbstractVector, v::AdjOrTransAbsVec) = broadcast(*, u, v) -# Adjoint/Transpose-vector * Adjoint/Transpose-vector -# (necessary for disambiguation with fallback methods in linalg/matmul) -*(u::AdjointAbsVec, v::AdjointAbsVec) = throw(MethodError(*, (u, v))) -*(u::TransposeAbsVec, v::TransposeAbsVec) = throw(MethodError(*, (u, v))) # AdjOrTransAbsVec{<:Any,<:AdjOrTransAbsVec} is a lazy conj vectors # We need to expand the combinations to avoid ambiguities diff --git a/stdlib/LinearAlgebra/src/qr.jl b/stdlib/LinearAlgebra/src/qr.jl index 537d107035ecd..f72bb715d39d8 100644 --- a/stdlib/LinearAlgebra/src/qr.jl +++ b/stdlib/LinearAlgebra/src/qr.jl @@ -725,7 +725,6 @@ function *(A::StridedMatrix, adjB::Adjoint{<:Any,<:AbstractQ}) throw(DimensionMismatch("matrix A has dimensions $(size(A)) but matrix B has dimensions $(size(B))")) end end -*(u::AdjointAbsVec, A::Adjoint{<:Any,<:AbstractQ}) = adjoint(A.parent * u.parent) ### AcQ/AcQc diff --git a/stdlib/LinearAlgebra/src/triangular.jl b/stdlib/LinearAlgebra/src/triangular.jl index 903e8954319ee..031d4b3b3f08f 100644 --- a/stdlib/LinearAlgebra/src/triangular.jl +++ b/stdlib/LinearAlgebra/src/triangular.jl @@ -2020,11 +2020,6 @@ function *(A::AbstractMatrix, transB::Transpose{<:Any,<:AbstractTriangular}) copyto!(AA, A) rmul!(AA, transpose(convert(AbstractArray{TAB}, B))) end -# ambiguity resolution with definitions in linalg/rowvector.jl -*(v::AdjointAbsVec, A::AbstractTriangular) = adjoint(adjoint(A) * v.parent) -*(v::TransposeAbsVec, A::AbstractTriangular) = transpose(transpose(A) * v.parent) -*(v::AdjointAbsVec, A::Adjoint{<:Any,<:AbstractTriangular}) = adjoint(A.parent * v.parent) -*(v::TransposeAbsVec, A::Transpose{<:Any,<:AbstractTriangular}) = transpose(A.parent * v.parent) # If these are not defined, they will fallback to the versions in matmul.jl