From c8d8d3a7b9dd6d0b22648b76be3a3ccfcf5da525 Mon Sep 17 00:00:00 2001 From: Douglas Bates Date: Wed, 3 Oct 2018 15:41:03 -0500 Subject: [PATCH 1/2] mul!, rmul! and lmul! methods for UniformScaling As per https://discourse.julialang.org/t/in-place-multiplication-methods-for-uniformscaling-type/15837 --- stdlib/LinearAlgebra/src/uniformscaling.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stdlib/LinearAlgebra/src/uniformscaling.jl b/stdlib/LinearAlgebra/src/uniformscaling.jl index 54db4d8a6b893..dfd992f2a0b67 100644 --- a/stdlib/LinearAlgebra/src/uniformscaling.jl +++ b/stdlib/LinearAlgebra/src/uniformscaling.jl @@ -163,6 +163,10 @@ end \(x::Number, J::UniformScaling) = UniformScaling(x\J.λ) +mul!(C::AbstractMatrix, A::AbstractMatrix, J::UniformScaling) = mul!(C, A, J.λ) +rmul!(A::AbstractMatrix, J::UniformScaling) = rmul!(A, J.λ) +lmul!(J::UniformScaling, B::AbstractMatrix) = lmul!(J.λ, B) + Broadcast.broadcasted(::typeof(*), x::Number,J::UniformScaling) = UniformScaling(x*J.λ) Broadcast.broadcasted(::typeof(*), J::UniformScaling,x::Number) = UniformScaling(J.λ*x) From 2c69aa6b3bb062e9c3de6dffb61a441c9481a74e Mon Sep 17 00:00:00 2001 From: Douglas Bates Date: Fri, 5 Oct 2018 10:44:03 -0500 Subject: [PATCH 2/2] Add tests and another mul! method --- stdlib/LinearAlgebra/src/uniformscaling.jl | 3 ++- stdlib/LinearAlgebra/test/uniformscaling.jl | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/uniformscaling.jl b/stdlib/LinearAlgebra/src/uniformscaling.jl index dfd992f2a0b67..be1379e9034f3 100644 --- a/stdlib/LinearAlgebra/src/uniformscaling.jl +++ b/stdlib/LinearAlgebra/src/uniformscaling.jl @@ -164,8 +164,9 @@ end \(x::Number, J::UniformScaling) = UniformScaling(x\J.λ) mul!(C::AbstractMatrix, A::AbstractMatrix, J::UniformScaling) = mul!(C, A, J.λ) +mul!(C::AbstractVecOrMat, J::UniformScaling, B::AbstractVecOrMat) = mul!(C, J.λ, B) rmul!(A::AbstractMatrix, J::UniformScaling) = rmul!(A, J.λ) -lmul!(J::UniformScaling, B::AbstractMatrix) = lmul!(J.λ, B) +lmul!(J::UniformScaling, B::AbstractVecOrMat) = lmul!(J.λ, B) Broadcast.broadcasted(::typeof(*), x::Number,J::UniformScaling) = UniformScaling(x*J.λ) Broadcast.broadcasted(::typeof(*), J::UniformScaling,x::Number) = UniformScaling(J.λ*x) diff --git a/stdlib/LinearAlgebra/test/uniformscaling.jl b/stdlib/LinearAlgebra/test/uniformscaling.jl index 2e2b33a08250e..c544736f9feac 100644 --- a/stdlib/LinearAlgebra/test/uniformscaling.jl +++ b/stdlib/LinearAlgebra/test/uniformscaling.jl @@ -269,4 +269,15 @@ end @test_throws MethodError I .+ [1 1; 1 1] end +@testset "in-place mul! methods" begin + J = randn()*I + A = randn(4, 3) + C = similar(A) + target = J * A + @test mul!(C, J, A) == target + @test mul!(C, A, J) == target + @test lmul!(J, copyto!(C, A)) == target + @test rmul!(copyto!(C, A), J) == target +end + end # module TestUniformscaling