## Lecture 29 - Bipartite Matrices
using LinearAlgebra
using SparseArrays
using Random
Random.seed!(0)
A = rand(-5.0:5, 6,4)
B = [spzeros(6,6) A; A' spzeros(4,4)]
10×10 SparseMatrixCSC{Float64, Int64} with 44 stored entries: ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ -1.0 -4.0 -3.0 1.0 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ -5.0 2.0 -2.0 -1.0 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 4.0 -2.0 -1.0 -5.0 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ -5.0 -5.0 4.0 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 2.0 ⋅ 3.0 1.0 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ -4.0 4.0 -4.0 -5.0 -1.0 -5.0 4.0 -5.0 2.0 -4.0 ⋅ ⋅ ⋅ ⋅ -4.0 2.0 -2.0 -5.0 ⋅ 4.0 ⋅ ⋅ ⋅ ⋅ -3.0 -2.0 -1.0 4.0 3.0 -4.0 ⋅ ⋅ ⋅ ⋅ 1.0 -1.0 -5.0 ⋅ 1.0 -5.0 ⋅ ⋅ ⋅ ⋅
##
eigvals(Matrix(B))
10-element Vector{Float64}: -10.534200145001812 -8.971604312666253 -6.599363520399757 -4.9989343351967594 -5.412163639425414e-15 8.309312122466312e-17 4.998934335196764 6.5993635203997565 8.971604312666262 10.534200145001808
##
sort(abs.(eigvals(Matrix(B))))
10-element Vector{Float64}: 8.309312122466312e-17 5.412163639425414e-15 4.9989343351967594 4.998934335196764 6.5993635203997565 6.599363520399757 8.971604312666253 8.971604312666262 10.534200145001808 10.534200145001812
## Final question:
# What are the singular values of A?
svdvals(Matrix(A))
4-element Vector{Float64}: 10.534200145001808 8.971604312666255 6.5993635203997565 4.998934335196757
##
function lanczos(A,b,k)
n = size(A,1)
V = zeros(n,k+1)
T = Tridiagonal(zeros(k-1), zeros(k), zeros(k-1))
rho = 0.0
V[:,1] = b/norm(b)
for j=1:k
y = A*V[:,j]
for i=max(j-1,1):j
T[i,j] = V[:,i]'*y
y -= T[i,j]*V[:,i]
end
rho = norm(y)
V[:,j+1] = y/rho
if j < k
T[j+1,j] = rho
end
end
return V,T,rho
end
U,T,rho = lanczos(B,[ones(6); zeros(4)],4)
([0.4082482904638631 0.0 … 0.0 -0.09228859067059805; 0.4082482904638631 0.0 … 0.0 0.4790594329372884; … ; 0.0 -0.2142857142857143 … -0.4028063848238582 0.0; 0.0 -0.6428571428571429 … 0.24893310450716952 0.0], [0.0 5.715476066494084 0.0 0.0; 5.715476066494082 0.0 6.149221509269934 0.0; 0.0 6.149221509269936 0.0 4.774348431569532; 0.0 0.0 4.774348431569531 0.0], 7.495668645088698)
##
U,T,rho = lanczos(B,[ones(6); ones(4)],4)
([0.31622776601683794 -0.13431339876147755 … -0.00023577165198764634 0.4456257987085685; 0.31622776601683794 -0.059694843893990046 … -0.5324328778917775 -0.031330545924039714; … ; 0.31622776601683794 0.1641608207084726 … 0.1694500436754723 -0.06359966575289865; 0.31622776601683794 -0.28355050849645264 … 0.2679678622640917 0.48968110564002854], [-5.2 4.237924020083418 0.0 0.0; 4.237924020083419 -1.9492204899777275 4.658971809672365 0.0; 0.0 4.658971809672366 0.025168711565927995 7.25588376684862; 0.0 0.0 7.255883766848619 0.1306746216798963], 4.812396112839309)
##
U,T,rho = lanczos(B,[zeros(6); ones(4)],4)
([0.0 -0.439219063596711 … 0.4786751140636702 0.0; 0.0 -0.37647348308289513 … -0.41016279017397617 0.0; … ; 0.5 0.0 … 0.0 0.8170655276747744; 0.5 0.0 … 0.0 -0.019252780765267714], [0.0 7.968688725254614 0.0 0.0; 7.968688725254614 0.0 3.650585111121684 0.0; 0.0 3.650585111121683 0.0 8.4664317253694; 0.0 0.0 8.466431725369402 0.0], 1.9820581278267)
## The Golub-Kahan process
# This "simplifies" Lanczos on a bipartite matrix
function golubkahan(A,v,k)
B = Bidiagonal(zeros(k),zeros(k-1),:L)
m,n = size(A)
V = zeros(n,k+1)
v = v/norm(v)
V[:,1] = v
U = zeros(m,k)
u = zeros(m)
beta = 0.0
for i=1:k
if i>1
B[i,i-1] = beta
end
Av = A*v - beta*u
B[i,i] = beta = norm(Av)
u = U[:,i] = normalize!(Av)
v = A'*Av - beta*v
beta = norm(v)
v = V[:,i+1] = normalize!(v)
end
return U,V,B,beta
end
U,V,BD,beta = golubkahan(A,ones(4),3)
([-0.43921906359671103 0.4786751140636701 -0.21289678015603625; -0.3764734830828952 -0.41016279017397617 0.12413082900853112; … ; 0.3764734830828952 0.016320831239238928 0.18263091390769756; -0.5647102246243427 -0.508663242765739 -0.19076767337858463], [0.5 0.6101674226014826 -0.4819143982255567 -0.3813846210569654; 0.5 -0.7820455698131674 -0.3158983486839499 -0.19650180669487746; 0.5 0.06015735152408987 0.8170655276747745 -0.28068668750610576; 0.5 0.11172079568759545 -0.019252780765267707 0.8585731152579458], 3×3 Bidiagonal{Float64, Vector{Float64}}: diag: 7.968688725254614 8.466431725369402 7.861572495459137 sub: 3.6505851111216825 1.9820581278267004, 3.3473933780954677)