4
4
mutable struct Bidiagonal{T} <: AbstractMatrix{T}
5
5
dv:: Vector{T} # diagonal
6
6
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
9
9
if length (ev) != length (dv)- 1
10
10
throw (DimensionMismatch (" length of diagonal vector is $(length (dv)) , length of off-diagonal vector is $(length (ev)) " ))
11
11
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)
13
16
end
14
17
end
18
+
15
19
"""
16
- Bidiagonal(dv, ev, isupper::Bool )
20
+ Bidiagonal(dv, ev, uplo::Symbol )
17
21
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`
20
24
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`
22
26
must be one less than the length of `dv`.
23
27
24
- # Example
25
-
28
+ # Examples
26
29
```jldoctest
27
- julia> dv = [1; 2; 3; 4]
30
+ julia> dv = [1, 2, 3, 4]
28
31
4-element Array{Int64,1}:
29
32
1
30
33
2
31
34
3
32
35
4
33
36
34
- julia> ev = [7; 8; 9]
37
+ julia> ev = [7, 8, 9]
35
38
3-element Array{Int64,1}:
36
39
7
37
40
8
38
41
9
39
42
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
41
44
4×4 Bidiagonal{Int64}:
42
45
1 7 ⋅ ⋅
43
46
⋅ 2 8 ⋅
44
47
⋅ ⋅ 3 9
45
48
⋅ ⋅ ⋅ 4
46
49
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
48
51
4×4 Bidiagonal{Int64}:
49
52
1 ⋅ ⋅ ⋅
50
53
7 2 ⋅ ⋅
51
54
⋅ 8 3 ⋅
52
55
⋅ ⋅ 9 4
53
56
```
54
57
"""
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
56
61
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." ))
57
62
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}
110
64
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 )
112
66
end
113
67
114
68
"""
115
- Bidiagonal(A, isupper::Bool )
69
+ Bidiagonal(A, uplo::Symbol )
116
70
117
71
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`).
121
73
74
+ # Examples
122
75
```jldoctest
123
76
julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
124
77
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]
127
80
3 3 3 3
128
81
4 4 4 4
129
82
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
131
84
4×4 Bidiagonal{Int64}:
132
85
1 1 ⋅ ⋅
133
86
⋅ 2 2 ⋅
134
87
⋅ ⋅ 3 3
135
88
⋅ ⋅ ⋅ 4
136
89
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
138
91
4×4 Bidiagonal{Int64}:
139
92
1 ⋅ ⋅ ⋅
140
93
2 2 ⋅ ⋅
141
94
⋅ 3 3 ⋅
142
95
⋅ ⋅ 4 4
143
96
```
144
97
"""
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 )
146
99
147
100
function getindex (A:: Bidiagonal{T} , i:: Integer , j:: Integer ) where T
148
101
if ! ((1 <= i <= size (A,2 )) && (1 <= j <= size (A,2 )))
174
127
175
128
# # structured matrix methods ##
176
129
function Base. replace_in_print_matrix (A:: Bidiagonal ,i:: Integer ,j:: Integer ,s:: AbstractString )
177
- if A. isupper
130
+ if A. uplo == ' U '
178
131
i== j || i== j- 1 ? s : Base. replace_with_centered_mark (s)
179
132
else
180
133
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
187
140
B = zeros (T, n, n)
188
141
for i = 1 : n - 1
189
142
B[i,i] = A. dv[i]
190
- if A. isupper
143
+ if A. uplo == ' U '
191
144
B[i, i + 1 ] = A. ev[i]
192
145
else
193
146
B[i + 1 , i] = A. ev[i]
@@ -205,29 +158,29 @@ promote_rule(::Type{Matrix{T}}, ::Type{Bidiagonal{S}}) where {T,S} = Matrix{prom
205
158
Tridiagonal (M:: Bidiagonal{T} ) where {T} = convert (Tridiagonal{T}, M)
206
159
function convert (:: Type{Tridiagonal{T}} , A:: Bidiagonal ) where T
207
160
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)
209
162
end
210
163
promote_rule (:: Type{Tridiagonal{T}} , :: Type{Bidiagonal{S}} ) where {T,S} = Tridiagonal{promote_type (T,S)}
211
164
212
165
# No-op for trivial conversion Bidiagonal{T} -> Bidiagonal{T}
213
166
convert (:: Type{Bidiagonal{T}} , A:: Bidiagonal{T} ) where {T} = A
214
167
# 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 )
216
169
# When asked to convert Bidiagonal to AbstractMatrix{T}, preserve structure by converting to Bidiagonal{T} <: AbstractMatrix{T}
217
170
convert (:: Type{AbstractMatrix{T}} , A:: Bidiagonal ) where {T} = convert (Bidiagonal{T}, A)
218
171
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 )
220
173
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 )
222
175
223
176
# ##################
224
177
# LAPACK routines #
225
178
# ##################
226
179
227
180
# 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 ]
229
182
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)
231
184
SVD (U, d, Vt)
232
185
end
233
186
svdfact (M:: Bidiagonal ; thin:: Bool = true ) = svdfact! (copy (M),thin= thin)
@@ -241,7 +194,7 @@ function show(io::IO, M::Bidiagonal)
241
194
println (io, summary (M), " :" )
242
195
print (io, " diag:" )
243
196
print_matrix (io, (M. dv)' )
244
- print (io, M. isupper ? " \n super:" : " \n sub:" )
197
+ print (io, M. uplo == ' U ' ? " \n super:" : " \n sub:" )
245
198
print_matrix (io, (M. ev)' )
246
199
end
247
200
@@ -257,38 +210,38 @@ function size(M::Bidiagonal, d::Integer)
257
210
end
258
211
259
212
# 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 )
265
218
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 )
267
220
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 )
272
225
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 )
275
228
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)
278
231
279
232
function tril! (M:: Bidiagonal , k:: Integer = 0 )
280
233
n = length (M. dv)
281
234
if abs (k) > n
282
235
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
284
237
fill! (M. dv,0 )
285
238
fill! (M. ev,0 )
286
239
elseif k < - 1
287
240
fill! (M. dv,0 )
288
241
fill! (M. ev,0 )
289
- elseif M. isupper && k == 0
242
+ elseif M. uplo == ' U ' && k == 0
290
243
fill! (M. ev,0 )
291
- elseif ! M . isupper && k == - 1
244
+ elseif M . uplo == ' L ' && k == - 1
292
245
fill! (M. dv,0 )
293
246
end
294
247
return M
@@ -298,15 +251,15 @@ function triu!(M::Bidiagonal, k::Integer=0)
298
251
n = length (M. dv)
299
252
if abs (k) > n
300
253
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
302
255
fill! (M. dv,0 )
303
256
fill! (M. ev,0 )
304
257
elseif k > 1
305
258
fill! (M. dv,0 )
306
259
fill! (M. ev,0 )
307
- elseif ! M . isupper && k == 0
260
+ elseif M . uplo == ' L ' && k == 0
308
261
fill! (M. ev,0 )
309
- elseif M. isupper && k == 1
262
+ elseif M. uplo == ' U ' && k == 1
310
263
fill! (M. dv,0 )
311
264
end
312
265
return M
@@ -316,9 +269,9 @@ function diag(M::Bidiagonal{T}, n::Integer=0) where T
316
269
if n == 0
317
270
return M. dv
318
271
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 )
320
273
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 )
322
275
elseif - size (M,1 ) < n < size (M,1 )
323
276
return zeros (T, size (M,1 )- abs (n))
324
277
else
@@ -327,26 +280,26 @@ function diag(M::Bidiagonal{T}, n::Integer=0) where T
327
280
end
328
281
329
282
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 )
332
285
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)). .. )
334
287
end
335
288
end
336
289
337
290
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 )
340
293
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)). .. )
342
295
end
343
296
end
344
297
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 )
347
300
* (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 )
350
303
351
304
const BiTriSym = Union{Bidiagonal,Tridiagonal,SymTridiagonal}
352
305
const BiTri = Union{Bidiagonal,Tridiagonal}
@@ -543,7 +496,7 @@ function naivesub!(A::Bidiagonal{T}, b::AbstractVector, x::AbstractVector = b) w
543
496
if N != length (b) || N != length (x)
544
497
throw (DimensionMismatch (" second dimension of A, $N , does not match one of the lengths of x, $(length (x)) , or b, $(length (b)) " ))
545
498
end
546
- if ! A . isupper # do forward substitution
499
+ if A . uplo == ' L ' # do forward substitution
547
500
for j = 1 : N
548
501
x[j] = b[j]
549
502
j > 1 && (x[j] -= A. ev[j- 1 ] * x[j- 1 ])
@@ -579,7 +532,7 @@ function eigvecs(M::Bidiagonal{T}) where T
579
532
Q = Matrix {T} (n,n)
580
533
blks = [0 ; find (x -> x == 0 , M. ev); n]
581
534
v = zeros (T, n)
582
- if M. isupper
535
+ if M. uplo == ' U '
583
536
for idx_block = 1 : length (blks) - 1 , i = blks[idx_block] + 1 : blks[idx_block + 1 ] # index of eigenvector
584
537
fill! (v, zero (T))
585
538
v[blks[idx_block] + 1 ] = one (T)
0 commit comments