Skip to content

Commit ff781e5

Browse files
fredrikekreandreasnoack
authored andcommitted
Use Symbol for uplo in Bidiagonal constructors (#22703)
- Consistent with Symmetric/Hermitian wrappers - It is clearer to use :U/:L instead of true/false - The Char constructor was originally for internal use only; remove and remove docstring
1 parent 987d365 commit ff781e5

18 files changed

+171
-225
lines changed

NEWS.md

+3
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ Deprecated or removed
148148

149149
* `read(::IO, ::Ref)` is now a method of `read!`, since it mutates its `Ref` argument ([#21592]).
150150

151+
* `Bidiagonal` constructors now use a `Symbol` (`:U` or `:L`) for the upper/lower
152+
argument, instead of a `Bool` or a `Char` ([#22703]).
153+
151154

152155
Julia v0.6.0 Release Notes
153156
==========================

base/deprecated.jl

+5
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,11 @@ function CartesianRange{N}(start::CartesianIndex{N}, stop::CartesianIndex{N})
15551555
CartesianRange(inds)
15561556
end
15571557

1558+
# PR #22703
1559+
@deprecate Bidiagonal(dv::AbstractVector, ev::AbstractVector, isupper::Bool) Bidiagonal(dv, ev, ifelse(isupper, :U, :L))
1560+
@deprecate Bidiagonal(dv::AbstractVector, ev::AbstractVector, uplo::Char) Bidiagonal(dv, ev, ifelse(uplo == 'U', :U, :L))
1561+
@deprecate Bidiagonal(A::AbstractMatrix, isupper::Bool) Bidiagonal(A, ifelse(isupper, :U, :L))
1562+
15581563
# END 0.7 deprecations
15591564

15601565
# BEGIN 1.0 deprecations

base/linalg/bidiag.jl

+70-117
Original file line numberDiff line numberDiff line change
@@ -4,121 +4,74 @@
44
mutable struct Bidiagonal{T} <: AbstractMatrix{T}
55
dv::Vector{T} # diagonal
66
ev::Vector{T} # sub/super diagonal
7-
isupper::Bool # is upper bidiagonal (true) or lower (false)
8-
function Bidiagonal{T}(dv::Vector{T}, ev::Vector{T}, isupper::Bool) where T
7+
uplo::Char # upper bidiagonal ('U') or lower ('L')
8+
function Bidiagonal{T}(dv::Vector{T}, ev::Vector{T}, uplo::Char) where T
99
if length(ev) != length(dv)-1
1010
throw(DimensionMismatch("length of diagonal vector is $(length(dv)), length of off-diagonal vector is $(length(ev))"))
1111
end
12-
new(dv, ev, isupper)
12+
new(dv, ev, uplo)
13+
end
14+
function Bidiagonal(dv::Vector{T}, ev::Vector{T}, uplo::Char) where T
15+
Bidiagonal{T}(dv, ev, uplo)
1316
end
1417
end
18+
1519
"""
16-
Bidiagonal(dv, ev, isupper::Bool)
20+
Bidiagonal(dv, ev, uplo::Symbol)
1721
18-
Constructs an upper (`isupper=true`) or lower (`isupper=false`) bidiagonal matrix using the
19-
given diagonal (`dv`) and off-diagonal (`ev`) vectors. The result is of type `Bidiagonal`
22+
Constructs an upper (`uplo=:U`) or lower (`uplo=:L`) bidiagonal matrix using the
23+
given diagonal (`dv`) and off-diagonal (`ev`) vectors. The result is of type `Bidiagonal`
2024
and provides efficient specialized linear solvers, but may be converted into a regular
21-
matrix with [`convert(Array, _)`](@ref) (or `Array(_)` for short). `ev`'s length
25+
matrix with [`convert(Array, _)`](@ref) (or `Array(_)` for short). The length of `ev`
2226
must be one less than the length of `dv`.
2327
24-
# Example
25-
28+
# Examples
2629
```jldoctest
27-
julia> dv = [1; 2; 3; 4]
30+
julia> dv = [1, 2, 3, 4]
2831
4-element Array{Int64,1}:
2932
1
3033
2
3134
3
3235
4
3336
34-
julia> ev = [7; 8; 9]
37+
julia> ev = [7, 8, 9]
3538
3-element Array{Int64,1}:
3639
7
3740
8
3841
9
3942
40-
julia> Bu = Bidiagonal(dv, ev, true) # ev is on the first superdiagonal
43+
julia> Bu = Bidiagonal(dv, ev, :U) # ev is on the first superdiagonal
4144
4×4 Bidiagonal{Int64}:
4245
1 7 ⋅ ⋅
4346
⋅ 2 8 ⋅
4447
⋅ ⋅ 3 9
4548
⋅ ⋅ ⋅ 4
4649
47-
julia> Bl = Bidiagonal(dv, ev, false) # ev is on the first subdiagonal
50+
julia> Bl = Bidiagonal(dv, ev, :L) # ev is on the first subdiagonal
4851
4×4 Bidiagonal{Int64}:
4952
1 ⋅ ⋅ ⋅
5053
7 2 ⋅ ⋅
5154
⋅ 8 3 ⋅
5255
⋅ ⋅ 9 4
5356
```
5457
"""
55-
Bidiagonal(dv::AbstractVector{T}, ev::AbstractVector{T}, isupper::Bool) where {T} = Bidiagonal{T}(collect(dv), collect(ev), isupper)
58+
function Bidiagonal(dv::AbstractVector{T}, ev::AbstractVector{T}, uplo::Symbol) where T
59+
Bidiagonal{T}(collect(dv), collect(ev), char_uplo(uplo))
60+
end
5661
Bidiagonal(dv::AbstractVector, ev::AbstractVector) = throw(ArgumentError("did you want an upper or lower Bidiagonal? Try again with an additional true (upper) or false (lower) argument."))
5762

58-
"""
59-
Bidiagonal(dv, ev, uplo::Char)
60-
61-
Constructs an upper (`uplo='U'`) or lower (`uplo='L'`) bidiagonal matrix using the
62-
given diagonal (`dv`) and off-diagonal (`ev`) vectors. The result is of type `Bidiagonal`
63-
and provides efficient specialized linear solvers, but may be converted into a regular
64-
matrix with [`convert(Array, _)`](@ref) (or `Array(_)` for short). `ev`'s
65-
length must be one less than the length of `dv`.
66-
67-
# Example
68-
69-
```jldoctest
70-
julia> dv = [1; 2; 3; 4]
71-
4-element Array{Int64,1}:
72-
1
73-
2
74-
3
75-
4
76-
77-
julia> ev = [7; 8; 9]
78-
3-element Array{Int64,1}:
79-
7
80-
8
81-
9
82-
83-
julia> Bu = Bidiagonal(dv, ev, 'U') #e is on the first superdiagonal
84-
4×4 Bidiagonal{Int64}:
85-
1 7 ⋅ ⋅
86-
⋅ 2 8 ⋅
87-
⋅ ⋅ 3 9
88-
⋅ ⋅ ⋅ 4
89-
90-
julia> Bl = Bidiagonal(dv, ev, 'L') #e is on the first subdiagonal
91-
4×4 Bidiagonal{Int64}:
92-
1 ⋅ ⋅ ⋅
93-
7 2 ⋅ ⋅
94-
⋅ 8 3 ⋅
95-
⋅ ⋅ 9 4
96-
```
97-
"""
98-
#Convert from BLAS uplo flag to boolean internal
99-
function Bidiagonal(dv::AbstractVector, ev::AbstractVector, uplo::Char)
100-
if uplo === 'U'
101-
isupper = true
102-
elseif uplo === 'L'
103-
isupper = false
104-
else
105-
throw(ArgumentError("Bidiagonal uplo argument must be upper 'U' or lower 'L', got $(repr(uplo))"))
106-
end
107-
Bidiagonal(collect(dv), collect(ev), isupper)
108-
end
109-
function Bidiagonal(dv::AbstractVector{Td}, ev::AbstractVector{Te}, isupper::Bool) where {Td,Te}
63+
function Bidiagonal(dv::AbstractVector{Td}, ev::AbstractVector{Te}, uplo::Symbol) where {Td,Te}
11064
T = promote_type(Td,Te)
111-
Bidiagonal(convert(Vector{T}, dv), convert(Vector{T}, ev), isupper)
65+
Bidiagonal(convert(Vector{T}, dv), convert(Vector{T}, ev), uplo)
11266
end
11367

11468
"""
115-
Bidiagonal(A, isupper::Bool)
69+
Bidiagonal(A, uplo::Symbol)
11670
11771
Construct a `Bidiagonal` matrix from the main diagonal of `A` and
118-
its first super- (if `isupper=true`) or sub-diagonal (if `isupper=false`).
119-
120-
# Example
72+
its first super- (if `uplo=:U`) or sub-diagonal (if `uplo=:L`).
12173
74+
# Examples
12275
```jldoctest
12376
julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
12477
4×4 Array{Int64,2}:
@@ -127,22 +80,22 @@ julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
12780
3 3 3 3
12881
4 4 4 4
12982
130-
julia> Bidiagonal(A, true) #contains the main diagonal and first superdiagonal of A
83+
julia> Bidiagonal(A, :U) #contains the main diagonal and first superdiagonal of A
13184
4×4 Bidiagonal{Int64}:
13285
1 1 ⋅ ⋅
13386
⋅ 2 2 ⋅
13487
⋅ ⋅ 3 3
13588
⋅ ⋅ ⋅ 4
13689
137-
julia> Bidiagonal(A, false) #contains the main diagonal and first subdiagonal of A
90+
julia> Bidiagonal(A, :L) #contains the main diagonal and first subdiagonal of A
13891
4×4 Bidiagonal{Int64}:
13992
1 ⋅ ⋅ ⋅
14093
2 2 ⋅ ⋅
14194
⋅ 3 3 ⋅
14295
⋅ ⋅ 4 4
14396
```
14497
"""
145-
Bidiagonal(A::AbstractMatrix, isupper::Bool)=Bidiagonal(diag(A), diag(A, isupper ? 1 : -1), isupper)
98+
Bidiagonal(A::AbstractMatrix, uplo::Symbol) = Bidiagonal(diag(A), diag(A, uplo == :U ? 1 : -1), uplo)
14699

147100
function getindex(A::Bidiagonal{T}, i::Integer, j::Integer) where T
148101
if !((1 <= i <= size(A,2)) && (1 <= j <= size(A,2)))
@@ -174,7 +127,7 @@ end
174127

175128
## structured matrix methods ##
176129
function Base.replace_in_print_matrix(A::Bidiagonal,i::Integer,j::Integer,s::AbstractString)
177-
if A.isupper
130+
if A.uplo == 'U'
178131
i==j || i==j-1 ? s : Base.replace_with_centered_mark(s)
179132
else
180133
i==j || i==j+1 ? s : Base.replace_with_centered_mark(s)
@@ -187,7 +140,7 @@ function convert(::Type{Matrix{T}}, A::Bidiagonal) where T
187140
B = zeros(T, n, n)
188141
for i = 1:n - 1
189142
B[i,i] = A.dv[i]
190-
if A.isupper
143+
if A.uplo == 'U'
191144
B[i, i + 1] = A.ev[i]
192145
else
193146
B[i + 1, i] = A.ev[i]
@@ -205,29 +158,29 @@ promote_rule(::Type{Matrix{T}}, ::Type{Bidiagonal{S}}) where {T,S} = Matrix{prom
205158
Tridiagonal(M::Bidiagonal{T}) where {T} = convert(Tridiagonal{T}, M)
206159
function convert(::Type{Tridiagonal{T}}, A::Bidiagonal) where T
207160
z = zeros(T, size(A)[1]-1)
208-
A.isupper ? Tridiagonal(z, convert(Vector{T},A.dv), convert(Vector{T},A.ev)) : Tridiagonal(convert(Vector{T},A.ev), convert(Vector{T},A.dv), z)
161+
A.uplo == 'U' ? Tridiagonal(z, convert(Vector{T},A.dv), convert(Vector{T},A.ev)) : Tridiagonal(convert(Vector{T},A.ev), convert(Vector{T},A.dv), z)
209162
end
210163
promote_rule(::Type{Tridiagonal{T}}, ::Type{Bidiagonal{S}}) where {T,S} = Tridiagonal{promote_type(T,S)}
211164

212165
# No-op for trivial conversion Bidiagonal{T} -> Bidiagonal{T}
213166
convert(::Type{Bidiagonal{T}}, A::Bidiagonal{T}) where {T} = A
214167
# Convert Bidiagonal to Bidiagonal{T} by constructing a new instance with converted elements
215-
convert(::Type{Bidiagonal{T}}, A::Bidiagonal) where {T} = Bidiagonal(convert(Vector{T}, A.dv), convert(Vector{T}, A.ev), A.isupper)
168+
convert(::Type{Bidiagonal{T}}, A::Bidiagonal) where {T} = Bidiagonal(convert(Vector{T}, A.dv), convert(Vector{T}, A.ev), A.uplo)
216169
# When asked to convert Bidiagonal to AbstractMatrix{T}, preserve structure by converting to Bidiagonal{T} <: AbstractMatrix{T}
217170
convert(::Type{AbstractMatrix{T}}, A::Bidiagonal) where {T} = convert(Bidiagonal{T}, A)
218171

219-
broadcast(::typeof(big), B::Bidiagonal) = Bidiagonal(big.(B.dv), big.(B.ev), B.isupper)
172+
broadcast(::typeof(big), B::Bidiagonal) = Bidiagonal(big.(B.dv), big.(B.ev), B.uplo)
220173

221-
similar(B::Bidiagonal, ::Type{T}) where {T} = Bidiagonal{T}(similar(B.dv, T), similar(B.ev, T), B.isupper)
174+
similar(B::Bidiagonal, ::Type{T}) where {T} = Bidiagonal{T}(similar(B.dv, T), similar(B.ev, T), B.uplo)
222175

223176
###################
224177
# LAPACK routines #
225178
###################
226179

227180
#Singular values
228-
svdvals!(M::Bidiagonal{<:BlasReal}) = LAPACK.bdsdc!(M.isupper ? 'U' : 'L', 'N', M.dv, M.ev)[1]
181+
svdvals!(M::Bidiagonal{<:BlasReal}) = LAPACK.bdsdc!(M.uplo, 'N', M.dv, M.ev)[1]
229182
function svdfact!(M::Bidiagonal{<:BlasReal}; thin::Bool=true)
230-
d, e, U, Vt, Q, iQ = LAPACK.bdsdc!(M.isupper ? 'U' : 'L', 'I', M.dv, M.ev)
183+
d, e, U, Vt, Q, iQ = LAPACK.bdsdc!(M.uplo, 'I', M.dv, M.ev)
231184
SVD(U, d, Vt)
232185
end
233186
svdfact(M::Bidiagonal; thin::Bool=true) = svdfact!(copy(M),thin=thin)
@@ -241,7 +194,7 @@ function show(io::IO, M::Bidiagonal)
241194
println(io, summary(M), ":")
242195
print(io, " diag:")
243196
print_matrix(io, (M.dv)')
244-
print(io, M.isupper ? "\n super:" : "\n sub:")
197+
print(io, M.uplo == 'U' ? "\n super:" : "\n sub:")
245198
print_matrix(io, (M.ev)')
246199
end
247200

@@ -257,38 +210,38 @@ function size(M::Bidiagonal, d::Integer)
257210
end
258211

259212
#Elementary operations
260-
broadcast(::typeof(abs), M::Bidiagonal) = Bidiagonal(abs.(M.dv), abs.(M.ev), abs.(M.isupper))
261-
broadcast(::typeof(round), M::Bidiagonal) = Bidiagonal(round.(M.dv), round.(M.ev), M.isupper)
262-
broadcast(::typeof(trunc), M::Bidiagonal) = Bidiagonal(trunc.(M.dv), trunc.(M.ev), M.isupper)
263-
broadcast(::typeof(floor), M::Bidiagonal) = Bidiagonal(floor.(M.dv), floor.(M.ev), M.isupper)
264-
broadcast(::typeof(ceil), M::Bidiagonal) = Bidiagonal(ceil.(M.dv), ceil.(M.ev), M.isupper)
213+
broadcast(::typeof(abs), M::Bidiagonal) = Bidiagonal(abs.(M.dv), abs.(M.ev), M.uplo)
214+
broadcast(::typeof(round), M::Bidiagonal) = Bidiagonal(round.(M.dv), round.(M.ev), M.uplo)
215+
broadcast(::typeof(trunc), M::Bidiagonal) = Bidiagonal(trunc.(M.dv), trunc.(M.ev), M.uplo)
216+
broadcast(::typeof(floor), M::Bidiagonal) = Bidiagonal(floor.(M.dv), floor.(M.ev), M.uplo)
217+
broadcast(::typeof(ceil), M::Bidiagonal) = Bidiagonal(ceil.(M.dv), ceil.(M.ev), M.uplo)
265218
for func in (:conj, :copy, :real, :imag)
266-
@eval ($func)(M::Bidiagonal) = Bidiagonal(($func)(M.dv), ($func)(M.ev), M.isupper)
219+
@eval ($func)(M::Bidiagonal) = Bidiagonal(($func)(M.dv), ($func)(M.ev), M.uplo)
267220
end
268-
broadcast(::typeof(round), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(round.(T, M.dv), round.(T, M.ev), M.isupper)
269-
broadcast(::typeof(trunc), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(trunc.(T, M.dv), trunc.(T, M.ev), M.isupper)
270-
broadcast(::typeof(floor), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(floor.(T, M.dv), floor.(T, M.ev), M.isupper)
271-
broadcast(::typeof(ceil), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(ceil.(T, M.dv), ceil.(T, M.ev), M.isupper)
221+
broadcast(::typeof(round), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(round.(T, M.dv), round.(T, M.ev), M.uplo)
222+
broadcast(::typeof(trunc), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(trunc.(T, M.dv), trunc.(T, M.ev), M.uplo)
223+
broadcast(::typeof(floor), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(floor.(T, M.dv), floor.(T, M.ev), M.uplo)
224+
broadcast(::typeof(ceil), ::Type{T}, M::Bidiagonal) where {T<:Integer} = Bidiagonal(ceil.(T, M.dv), ceil.(T, M.ev), M.uplo)
272225

273-
transpose(M::Bidiagonal) = Bidiagonal(M.dv, M.ev, !M.isupper)
274-
ctranspose(M::Bidiagonal) = Bidiagonal(conj(M.dv), conj(M.ev), !M.isupper)
226+
transpose(M::Bidiagonal) = Bidiagonal(M.dv, M.ev, M.uplo == 'U' ? :L : :U)
227+
ctranspose(M::Bidiagonal) = Bidiagonal(conj(M.dv), conj(M.ev), M.uplo == 'U' ? :L : :U)
275228

276-
istriu(M::Bidiagonal) = M.isupper || iszero(M.ev)
277-
istril(M::Bidiagonal) = !M.isupper || iszero(M.ev)
229+
istriu(M::Bidiagonal) = M.uplo == 'U' || iszero(M.ev)
230+
istril(M::Bidiagonal) = M.uplo == 'L' || iszero(M.ev)
278231

279232
function tril!(M::Bidiagonal, k::Integer=0)
280233
n = length(M.dv)
281234
if abs(k) > n
282235
throw(ArgumentError("requested diagonal, $k, out of bounds in matrix of size ($n,$n)"))
283-
elseif M.isupper && k < 0
236+
elseif M.uplo == 'U' && k < 0
284237
fill!(M.dv,0)
285238
fill!(M.ev,0)
286239
elseif k < -1
287240
fill!(M.dv,0)
288241
fill!(M.ev,0)
289-
elseif M.isupper && k == 0
242+
elseif M.uplo == 'U' && k == 0
290243
fill!(M.ev,0)
291-
elseif !M.isupper && k == -1
244+
elseif M.uplo == 'L' && k == -1
292245
fill!(M.dv,0)
293246
end
294247
return M
@@ -298,15 +251,15 @@ function triu!(M::Bidiagonal, k::Integer=0)
298251
n = length(M.dv)
299252
if abs(k) > n
300253
throw(ArgumentError("requested diagonal, $k, out of bounds in matrix of size ($n,$n)"))
301-
elseif !M.isupper && k > 0
254+
elseif M.uplo == 'L' && k > 0
302255
fill!(M.dv,0)
303256
fill!(M.ev,0)
304257
elseif k > 1
305258
fill!(M.dv,0)
306259
fill!(M.ev,0)
307-
elseif !M.isupper && k == 0
260+
elseif M.uplo == 'L' && k == 0
308261
fill!(M.ev,0)
309-
elseif M.isupper && k == 1
262+
elseif M.uplo == 'U' && k == 1
310263
fill!(M.dv,0)
311264
end
312265
return M
@@ -316,9 +269,9 @@ function diag(M::Bidiagonal{T}, n::Integer=0) where T
316269
if n == 0
317270
return M.dv
318271
elseif n == 1
319-
return M.isupper ? M.ev : zeros(T, size(M,1)-1)
272+
return M.uplo == 'U' ? M.ev : zeros(T, size(M,1)-1)
320273
elseif n == -1
321-
return M.isupper ? zeros(T, size(M,1)-1) : M.ev
274+
return M.uplo == 'L' ? M.ev : zeros(T, size(M,1)-1)
322275
elseif -size(M,1) < n < size(M,1)
323276
return zeros(T, size(M,1)-abs(n))
324277
else
@@ -327,26 +280,26 @@ function diag(M::Bidiagonal{T}, n::Integer=0) where T
327280
end
328281

329282
function +(A::Bidiagonal, B::Bidiagonal)
330-
if A.isupper == B.isupper
331-
Bidiagonal(A.dv+B.dv, A.ev+B.ev, A.isupper)
283+
if A.uplo == B.uplo
284+
Bidiagonal(A.dv+B.dv, A.ev+B.ev, A.uplo)
332285
else
333-
Tridiagonal((A.isupper ? (B.ev,A.dv+B.dv,A.ev) : (A.ev,A.dv+B.dv,B.ev))...)
286+
Tridiagonal((A.uplo == 'U' ? (B.ev,A.dv+B.dv,A.ev) : (A.ev,A.dv+B.dv,B.ev))...)
334287
end
335288
end
336289

337290
function -(A::Bidiagonal, B::Bidiagonal)
338-
if A.isupper == B.isupper
339-
Bidiagonal(A.dv-B.dv, A.ev-B.ev, A.isupper)
291+
if A.uplo == B.uplo
292+
Bidiagonal(A.dv-B.dv, A.ev-B.ev, A.uplo)
340293
else
341-
Tridiagonal((A.isupper ? (-B.ev,A.dv-B.dv,A.ev) : (A.ev,A.dv-B.dv,-B.ev))...)
294+
Tridiagonal((A.uplo == 'U' ? (-B.ev,A.dv-B.dv,A.ev) : (A.ev,A.dv-B.dv,-B.ev))...)
342295
end
343296
end
344297

345-
-(A::Bidiagonal)=Bidiagonal(-A.dv,-A.ev,A.isupper)
346-
*(A::Bidiagonal, B::Number) = Bidiagonal(A.dv*B, A.ev*B, A.isupper)
298+
-(A::Bidiagonal)=Bidiagonal(-A.dv,-A.ev,A.uplo)
299+
*(A::Bidiagonal, B::Number) = Bidiagonal(A.dv*B, A.ev*B, A.uplo)
347300
*(B::Number, A::Bidiagonal) = A*B
348-
/(A::Bidiagonal, B::Number) = Bidiagonal(A.dv/B, A.ev/B, A.isupper)
349-
==(A::Bidiagonal, B::Bidiagonal) = (A.dv==B.dv) && (A.ev==B.ev) && (A.isupper==B.isupper)
301+
/(A::Bidiagonal, B::Number) = Bidiagonal(A.dv/B, A.ev/B, A.uplo)
302+
==(A::Bidiagonal, B::Bidiagonal) = (A.uplo==B.uplo) && (A.dv==B.dv) && (A.ev==B.ev)
350303

351304
const BiTriSym = Union{Bidiagonal,Tridiagonal,SymTridiagonal}
352305
const BiTri = Union{Bidiagonal,Tridiagonal}
@@ -543,7 +496,7 @@ function naivesub!(A::Bidiagonal{T}, b::AbstractVector, x::AbstractVector = b) w
543496
if N != length(b) || N != length(x)
544497
throw(DimensionMismatch("second dimension of A, $N, does not match one of the lengths of x, $(length(x)), or b, $(length(b))"))
545498
end
546-
if !A.isupper #do forward substitution
499+
if A.uplo == 'L' #do forward substitution
547500
for j = 1:N
548501
x[j] = b[j]
549502
j > 1 && (x[j] -= A.ev[j-1] * x[j-1])
@@ -579,7 +532,7 @@ function eigvecs(M::Bidiagonal{T}) where T
579532
Q = Matrix{T}(n,n)
580533
blks = [0; find(x -> x == 0, M.ev); n]
581534
v = zeros(T, n)
582-
if M.isupper
535+
if M.uplo == 'U'
583536
for idx_block = 1:length(blks) - 1, i = blks[idx_block] + 1:blks[idx_block + 1] #index of eigenvector
584537
fill!(v, zero(T))
585538
v[blks[idx_block] + 1] = one(T)

0 commit comments

Comments
 (0)