From 6613008ffdbd6e7ade81032e4647423ab1c8e48b Mon Sep 17 00:00:00 2001 From: Lea Kapelevich Date: Sun, 28 Mar 2021 20:28:56 -0400 Subject: [PATCH 1/4] define dot between AbstractMatrix and UniformScaling --- stdlib/LinearAlgebra/src/uniformscaling.jl | 3 +++ stdlib/LinearAlgebra/test/uniformscaling.jl | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/stdlib/LinearAlgebra/src/uniformscaling.jl b/stdlib/LinearAlgebra/src/uniformscaling.jl index c59871e0641ef..963f38279ff00 100644 --- a/stdlib/LinearAlgebra/src/uniformscaling.jl +++ b/stdlib/LinearAlgebra/src/uniformscaling.jl @@ -480,6 +480,9 @@ Array(s::UniformScaling, dims::Dims{2}) = Matrix(s, dims) Diagonal{T}(s::UniformScaling, m::Integer) where {T} = Diagonal{T}(fill(T(s.λ), m)) Diagonal(s::UniformScaling, m::Integer) = Diagonal{eltype(s)}(s, m) +dot(A::AbstractMatrix, J::UniformScaling) = tr(A)*J.λ +dot(J::UniformScaling, A::AbstractMatrix) = J.λ*tr(A) + dot(x::AbstractVector, J::UniformScaling, y::AbstractVector) = dot(x, J.λ, y) dot(x::AbstractVector, a::Number, y::AbstractVector) = sum(t -> dot(t[1], a, t[2]), zip(x, y)) dot(x::AbstractVector, a::Union{Real,Complex}, y::AbstractVector) = a*dot(x, y) diff --git a/stdlib/LinearAlgebra/test/uniformscaling.jl b/stdlib/LinearAlgebra/test/uniformscaling.jl index 27f6641657e81..7fd2c168c0a87 100644 --- a/stdlib/LinearAlgebra/test/uniformscaling.jl +++ b/stdlib/LinearAlgebra/test/uniformscaling.jl @@ -460,6 +460,14 @@ end @test I(3) == [1 0 0; 0 1 0; 0 0 1] end +@testset "dot" begin + A = rand(-10:10, 3, 3) + λ = rand(-10:10) + J = UniformScaling(λ) + @test dot(A, J) ≈ dot(J, A) + @test dot(A, J) ≈ tr(λ * A) +end + @testset "generalized dot" begin x = rand(-10:10, 3) y = rand(-10:10, 3) From a3dd3512baa98a5728dcb37e5efd16383ef26fc5 Mon Sep 17 00:00:00 2001 From: Lea Kapelevich Date: Sun, 28 Mar 2021 20:32:00 -0400 Subject: [PATCH 2/4] fix equality check --- stdlib/LinearAlgebra/test/uniformscaling.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/test/uniformscaling.jl b/stdlib/LinearAlgebra/test/uniformscaling.jl index 7fd2c168c0a87..4895a9c7aa2d0 100644 --- a/stdlib/LinearAlgebra/test/uniformscaling.jl +++ b/stdlib/LinearAlgebra/test/uniformscaling.jl @@ -464,8 +464,8 @@ end A = rand(-10:10, 3, 3) λ = rand(-10:10) J = UniformScaling(λ) - @test dot(A, J) ≈ dot(J, A) - @test dot(A, J) ≈ tr(λ * A) + @test dot(A, J) == dot(J, A) + @test dot(A, J) == tr(λ * A) end @testset "generalized dot" begin From bb8f7d4cd429ea98e44cd3841d899571557863aa Mon Sep 17 00:00:00 2001 From: Lea Kapelevich Date: Tue, 30 Mar 2021 08:18:04 -0400 Subject: [PATCH 3/4] fix for complex --- stdlib/LinearAlgebra/src/uniformscaling.jl | 4 ++-- stdlib/LinearAlgebra/test/uniformscaling.jl | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/stdlib/LinearAlgebra/src/uniformscaling.jl b/stdlib/LinearAlgebra/src/uniformscaling.jl index 963f38279ff00..edcf12796550d 100644 --- a/stdlib/LinearAlgebra/src/uniformscaling.jl +++ b/stdlib/LinearAlgebra/src/uniformscaling.jl @@ -480,8 +480,8 @@ Array(s::UniformScaling, dims::Dims{2}) = Matrix(s, dims) Diagonal{T}(s::UniformScaling, m::Integer) where {T} = Diagonal{T}(fill(T(s.λ), m)) Diagonal(s::UniformScaling, m::Integer) = Diagonal{eltype(s)}(s, m) -dot(A::AbstractMatrix, J::UniformScaling) = tr(A)*J.λ -dot(J::UniformScaling, A::AbstractMatrix) = J.λ*tr(A) +dot(A::AbstractMatrix, J::UniformScaling) = dot(tr(A), J.λ) +dot(J::UniformScaling, A::AbstractMatrix) = dot(J.λ, tr(A)) dot(x::AbstractVector, J::UniformScaling, y::AbstractVector) = dot(x, J.λ, y) dot(x::AbstractVector, a::Number, y::AbstractVector) = sum(t -> dot(t[1], a, t[2]), zip(x, y)) diff --git a/stdlib/LinearAlgebra/test/uniformscaling.jl b/stdlib/LinearAlgebra/test/uniformscaling.jl index 4895a9c7aa2d0..ab0d503649898 100644 --- a/stdlib/LinearAlgebra/test/uniformscaling.jl +++ b/stdlib/LinearAlgebra/test/uniformscaling.jl @@ -461,11 +461,17 @@ end end @testset "dot" begin - A = rand(-10:10, 3, 3) - λ = rand(-10:10) + A = randn(3, 3) + λ = randn() + J = UniformScaling(λ) + @test dot(A, J) ≈ dot(J, A) + @test dot(A, J) ≈ tr(A' * J) + + A = rand(ComplexF64, 3, 3) + λ = randn() + im * randn() J = UniformScaling(λ) - @test dot(A, J) == dot(J, A) - @test dot(A, J) == tr(λ * A) + @test dot(A, J) ≈ conj(dot(J, A)) + @test dot(A, J) ≈ tr(A' * J) end @testset "generalized dot" begin From 37542fac44b2f3bf1e877726936180afc047e4f0 Mon Sep 17 00:00:00 2001 From: Lea Kapelevich Date: Wed, 7 Apr 2021 10:11:57 -0400 Subject: [PATCH 4/4] add news entry --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 140da486c30bf..855da0305ba5d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -74,6 +74,7 @@ Standard library changes * OpenBLAS is updated to 0.3.13. ([#39216]) * SuiteSparse is updated to 5.8.1. ([#39455]) * `cis(A)` now supports matrix arguments ([#40194]). +* `dot` now supports `UniformScaling` with `AbstractMatrix` ([#40250]). #### Markdown