@@ -28,7 +28,7 @@ function generic_svdfact!(X::AbstractMatrix; sorted=true, thin=true)
28
28
end
29
29
B,P = bidiagonalize_tall! (X)
30
30
U,Vt = unpack (P,thin= thin)
31
- U,S,Vt = svd ! (B,U,Vt)
31
+ U,S,Vt = svd_bidiag ! (B,U,Vt)
32
32
# as of Julia v0.7 we need to revert a mysterious transpose here
33
33
Vt= Vt'
34
34
for i = 1 : n
@@ -54,12 +54,8 @@ function generic_svdvals!(X::AbstractMatrix; sorted=true)
54
54
X = X'
55
55
end
56
56
B,P = bidiagonalize_tall! (X)
57
- S = svd! (B)
58
- for i = eachindex (S)
59
- if signbit (S[i])
60
- S[i] = - S[i]
61
- end
62
- end
57
+ S = svd_bidiag! (B)
58
+ S .= abs .(S)
63
59
sorted ? sort! (S,rev= true ) : S
64
60
end
65
61
83
79
84
80
85
81
"""
86
- svd !(B::Bidiagonal [, U, Vt [, ϵ]])
82
+ svd_bidiag !(B::Bidiagonal [, U, Vt [, ϵ]])
87
83
88
84
Compute the SVD of a bidiagonal matrix `B`, via an implicit QR algorithm with shift (known as a Golub-Kahan iterations).
89
85
@@ -106,7 +102,7 @@ This proceeds by iteratively finding the lowest strictly-bidiagonal submatrix, i
106
102
```
107
103
then applying a Golub-Kahan QR iteration.
108
104
"""
109
- function svd ! (B:: Bidiagonal{T} , U= nothing , Vt= nothing , ɛ= eps (T)) where T <: Real
105
+ function svd_bidiag ! (B:: Bidiagonal{T} , U= nothing , Vt= nothing , ɛ= eps (T)) where T <: Real
110
106
n = size (B, 1 )
111
107
if n == 1
112
108
@goto done
@@ -156,16 +152,19 @@ function svd!(B::Bidiagonal{T}, U=nothing, Vt=nothing, ɛ=eps(T)) where T <: Rea
156
152
shift = abs (s₁- h) < abs (s₂- h) ? s₁ : s₂
157
153
# avoid infinite loop
158
154
if ! all (isfinite .(B))
159
- (U == nothing ) && return B. dv+ NaN
160
- return SVD (U .+ NaN , B. dv .+ NaN , Vt .+ NaN )
155
+ if U === nothing
156
+ return B. dv+ NaN
157
+ else
158
+ return SVD (U .+ NaN , B. dv .+ NaN , Vt .+ NaN )
159
+ end
161
160
end
162
161
svd_gk! (B, U, Vt, n₁, n₂, shift)
163
162
end
164
163
else
165
164
throw (ArgumentError (" lower bidiagonal version not implemented yet" ))
166
165
end
167
166
@label done
168
- if U == nothing
167
+ if U === nothing
169
168
return B. dv
170
169
else
171
170
return SVD (U, B. dv, Vt)
0 commit comments