-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LinearAlgebra] Add isdiag/isposdef for Diagonal and UniformScaling #29638
Changes from 4 commits
6d1efa9
d281128
79315b1
c582998
b53c3a5
aeb2b56
b614442
ffe7cf3
e68c778
7dcd568
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -74,10 +74,12 @@ oneunit(J::UniformScaling{T}) where {T} = oneunit(UniformScaling{T}) | |
zero(::Type{UniformScaling{T}}) where {T} = UniformScaling(zero(T)) | ||
zero(J::UniformScaling{T}) where {T} = zero(UniformScaling{T}) | ||
|
||
isdiag(::UniformScaling) = true | ||
istriu(::UniformScaling) = true | ||
istril(::UniformScaling) = true | ||
issymmetric(::UniformScaling) = true | ||
ishermitian(J::UniformScaling) = isreal(J.λ) | ||
isposdef(J::UniformScaling) = J.λ > zero(J.λ) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This fails when You can simply do |
||
|
||
(+)(J::UniformScaling, x::Number) = J.λ + x | ||
(+)(x::Number, J::UniformScaling) = x + J.λ | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,13 +30,16 @@ end | |
@test conj(UniformScaling(1.0+1.0im))::UniformScaling{Complex{Float64}} == UniformScaling(1.0-1.0im) | ||
end | ||
|
||
@testset "istriu, istril, issymmetric, ishermitian, isapprox" begin | ||
@testset "isdiag, istriu, istril, issymmetric, ishermitian, isposdef, isapprox" begin | ||
@test isdiag(I) | ||
@test istriu(I) | ||
@test istril(I) | ||
@test issymmetric(I) | ||
@test issymmetric(UniformScaling(complex(1.0,1.0))) | ||
@test ishermitian(I) | ||
@test !ishermitian(UniformScaling(complex(1.0,1.0))) | ||
@test isposdef(I) | ||
@test !isposdef(-I) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe test these for complex-valued There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I think that's what @mcognetta's suggestion above does, I believe. This is now included. |
||
@test UniformScaling(4.00000000000001) ≈ UniformScaling(4.0) | ||
@test UniformScaling(4.32) ≈ UniformScaling(4.3) rtol=0.1 atol=0.01 | ||
@test UniformScaling(4.32) ≈ 4.3 * [1 0; 0 1] rtol=0.1 atol=0.01 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, one more thing. This fails when we have a block diagonal matrix in which not all blocks are diagonal.
MWE:
I believe it should be
isdiag(D::Diagonal) = all(isdiag, D.diag)
isdiag(D::Diagonal{<:Number}) = true
But I am not so sure on what it means to be a matrix of matrices so maybe @fredrikekre can correct me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, I only had the
Number
case in mind. I'll fix this.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
... and add a test.