Here is a working example of the SVD Rank-1 Update process outline in [Brand 2006]. I also referenced this Python code w/ a few modifications. Note, I added an `isapprox`

helper to compare results.

**EDIT: This still needs some work. Although the original matrix can be recovered, the singular values are not correct. I think there is an issue with the normality constraint for the left/right singular vectors**

```
using LinearAlgebra
import Base: ≈
function ≈(A::SVD{T},B::SVD{T}) where T<:Number
A.U*Diagonal(A.S)*A.Vt≈B.U*Diagonal(B.S)*B.Vt
end
function svd_rank_one_update(Q::SVD{T}, a::AbstractArray{T,1}) where T<:Number
U = Q.U
S = Q.S
Vt = Q.Vt
r = length(S)
b = zeros(r+1)
b[end] = 1
m = U'*a
p = a-U*m
Ra = norm(p)
P = p/Ra
Vt = vcat(Vt, zeros(1,size(Vt,2)))
n = Vt'*b
q = b - Vt*n
Rb = norm(q)
Q = q/Rb
K = zeros(r+1, r+1) # could use spzeros
K[1:end-1,end] = m
K[1:end-1,1:end-1] = Diagonal(S)
K[end,end] = Ra
U_P = hcat(U,P)
V_Q = hcat(Vt,Q)
eig_vals , eig_vec = eigen(K)
U_P_dot_Up = U_P*eig_vec
V_Q_dot_Vq = inv(eig_vec)*V_Q
return SVD(U_P_dot_Up, eig_vals, V_Q_dot_Vq)
end
```

Test:

```
## Generate data and compute SVD
r = 10
data = rand(r,1000000)
Q = svd(data)
## Augment data w/ a vector & compute SVD
a = rand(r)
data_aug = hcat(data,a)
Q_aug = svd(data_aug)
## Rank-1 update of original SVD
Q_rank1 = svd_rank_one_update(Q,a)
Q_aug ≈ Q_rank1 #true
```

Benchmark rank-1 update vs. concatenate then svd

```
@btime svd_rank_one_update($Q,$a) #100.994 ms (43 allocations: 267.05 MiB)
@btime svd(hcat($data,$a)) #504.592 ms (14 allocations: 228.89 MiB)
```

I am a relative noob to Julia, so any suggested improvements are welcome.