Skip to content

Commit b3f2756

Browse files
committed
Minor cleanup
1 parent cdec707 commit b3f2756

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

ext/IntervalArithmeticLinearAlgebraExt.jl

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ end
6464

6565
function LinearAlgebra.eigvals!(A::AbstractMatrix{<:Interval}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby)
6666
# note: this function does not overwrite `A`
67-
v = _eigvals(A, permute, scale, sortby)
68-
isreal(v) && return v
69-
_fold_conjugate!(v)
70-
isreal(v) && return real(v)
71-
return v
67+
λ = _eigvals(A, permute, scale, sortby)
68+
isreal(λ) && return real(λ)
69+
_fold_conjugate!(λ)
70+
isreal(λ) && return real(λ)
71+
return λ
7272
end
7373

7474
LinearAlgebra.eigvals!(A::AbstractMatrix{<:Complex{<:Interval}}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
@@ -102,20 +102,20 @@ function _similarity_transform(A, permute, scale, sortby)
102102
return V
103103
end
104104

105-
function _fold_conjugate!(v)
106-
for i eachindex(v)
107-
vᵢ = v[i]
108-
idxs = findall(j -> (j i) & !isdisjoint_interval(conj(vᵢ), v[j]), eachindex(v))
105+
function _fold_conjugate!(λ)
106+
for i eachindex(λ)
107+
λᵢ = λ[i]
108+
idxs = findall(j -> (j i) & !isdisjoint_interval(conj(λᵢ), λ[j]), eachindex(λ))
109109
if isempty(idxs)
110-
v[i] = real(vᵢ)
110+
λ[i] = real(λᵢ)
111111
else
112-
w = view(v, idxs)
113-
z = conj(intersect_interval(conj(vᵢ), reduce(intersect_interval, w)))
114-
z = complex(IntervalArithmetic.setdecoration(real(z), min(decoration(real(vᵢ)), minimum(decoration real, w))), IntervalArithmetic.setdecoration(imag(z), min(decoration(imag(vᵢ)), minimum(decoration imag, w))))
115-
v[i] = z
112+
w = view(λ, idxs)
113+
z = conj(intersect_interval(conj(λᵢ), reduce(intersect_interval, w)))
114+
z = complex(IntervalArithmetic.setdecoration(real(z), min(decoration(real(λᵢ)), minimum(decoration real, w))), IntervalArithmetic.setdecoration(imag(z), min(decoration(imag(λᵢ)), minimum(decoration imag, w))))
115+
λ[i] = z
116116
end
117117
end
118-
return v
118+
return λ
119119
end
120120

121121
# matrix determinant
@@ -128,7 +128,7 @@ LinearAlgebra.det(A::AbstractMatrix{<:Complex{<:Interval}}) = reduce(*, LinearAl
128128

129129
function LinearAlgebra.eigen!(A::AbstractMatrix{<:RealOrComplexI}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby)
130130
# note: this function does not overwrite `A`
131-
λ, v = eigen!(mid.(A); permute, scale, sortby)
131+
λ, v = LinearAlgebra.eigen!(mid.(A); permute, scale, sortby)
132132
n = length(λ)
133133
inds = [argmax(i -> abs(v[i,j]), 1:n) for j 1:n]
134134
ref_scale = [v[inds[j],j] for j 1:n]
@@ -151,8 +151,8 @@ function LinearAlgebra.eigen!(A::AbstractMatrix{<:RealOrComplexI}; permute::Bool
151151
if strictprecedes(Z₁, one(Z₁)) & precedes(interval(2) * Y * Z₂, (interval(1) - Z₁)^2)
152152
r = sup(( interval(1) - Z₁ - sqrt( (interval(1) - Z₁)^2 - interval(2) * Y * Z₂ ) ) / Z₂)
153153
true_λ = interval.(λ, r; format = :midpoint)
154-
_fold_conjugate!(true_λ)
155154
true_v = interval.(v, r; format = :midpoint)
155+
_fold_conjugate!(eltype(A), true_λ, true_v)
156156
foreach(j -> true_v[:,j] .*= interval(ref_scale[j]), 1:n)
157157
else
158158
true_λ = fill(nai(eltype(λ_bar)), n)
@@ -162,6 +162,25 @@ function LinearAlgebra.eigen!(A::AbstractMatrix{<:RealOrComplexI}; permute::Bool
162162
return LinearAlgebra.Eigen(true_λ, true_v)
163163
end
164164

165+
_fold_conjugate!(::Type{<:ComplexI}, λ, v) = (λ, v)
166+
167+
function _fold_conjugate!(::Type{<:Interval}, λ, v)
168+
for i eachindex(λ)
169+
λᵢ = λ[i]
170+
idxs = findall(j -> (j i) & !isdisjoint_interval(conj(λᵢ), λ[j]), eachindex(λ))
171+
if isempty(idxs)
172+
λ[i] = real(λᵢ)
173+
v[:,i] .= real.(view(v, :, i))
174+
else
175+
w = view(λ, idxs)
176+
z = conj(intersect_interval(conj(λᵢ), reduce(intersect_interval, w)))
177+
z = complex(IntervalArithmetic.setdecoration(real(z), min(decoration(real(λᵢ)), minimum(decoration real, w))), IntervalArithmetic.setdecoration(imag(z), min(decoration(imag(λᵢ)), minimum(decoration imag, w))))
178+
λ[i] = z
179+
end
180+
end
181+
return λ, v
182+
end
183+
165184
# matrix inversion
166185
# note: use the contraction mapping theorem, only works when the entries of A have small radii
167186

0 commit comments

Comments
 (0)