# Add relative and absolute tolerance for rank. #29926

Merged
merged 16 commits into from Dec 6, 2018
+21 −10
Merged

# Add relative and absolute tolerance for rank.#29926

Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
Filter file types
Failed to load files and symbols.

#### Just for now

@@ -715,10 +715,9 @@ end
rank(A[, tol::Real])
Compute the rank of a matrix by counting how many singular
values of `A` have magnitude greater than `tol*σ₁` where `σ₁` is
`A`'s largest singular values. By default, the value of `tol` is the smallest
dimension of `A` multiplied by the [`eps`](@ref)
of the [`eltype`](@ref) of `A`.
values of `A` have magnitude greater than `rtol*σ₁ + atol` where `σ₁` is
`A`'s largest singular values, atol and rtol are the absolute and relative
This conversation was marked as resolved by sam0410
tolerance respectively.
This conversation was marked as resolved by sam0410
# Examples
```jldoctest
@@ -728,16 +727,19 @@ julia> rank(Matrix(I, 3, 3))
julia> rank(diagm(0 => [1, 0, 2]))
2
julia> rank(diagm(0 => [1, 0.001, 2]), 0.1)
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2
julia> rank(diagm(0 => [1, 0.001, 2]), 0.00001)
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3
julia> rank(diagm(0 => [1, 0.001, 2]), atol=0.00001, rtol=0.00001)
This conversation was marked as resolved by sam0410
3
```
"""
function rank(A::AbstractMatrix, tol::Real = min(size(A)...)*eps(real(float(one(eltype(A))))))
function rank(A::AbstractMatrix; atol=0.0, rtol=0.0)
This conversation was marked as resolved by sam0410
s = svdvals(A)
count(x -> x > tol*s[1], s)
count(x -> x > (atol + rtol * s[1]), s)
This conversation was marked as resolved by sam0410
end
rank(x::Number) = x == 0 ? 0 : 1

 @@ -194,7 +194,9 @@ end end @test rank(fill(0, 0, 0)) == 0 @test rank([1.0 0.0; 0.0 0.9],0.95) == 1 @test rank([1.0 0.0; 0.0 0.9],rtol=0.95) == 1 @test rank([1.0 0.0; 0.0 0.9],atol=0.95) == 1 @test rank([1.0 0.0; 0.0 0.9],atol=0.95,rtol=0.95)==0 @test qr(big.([0 1; 0 0])).R == [0 1; 0 0] @test norm([2.4e-322, 4.4e-323]) ≈ 2.47e-322
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.