A = randn(5,5) U,σ,V = svd(A) display(U), display(σ), display(V); σ Σ = Diagonal(σ) round.(U'U,2) round.(V'V,2) σ Σ=Diagonal(σ) U*Σ*V' A A = randn(5,3) U,σ,V = svd(A,thin=false) # thin=false gives the basic svd, # often the default (thin=true) is more useful display(U), display(σ), display(V); Σ = zeros(A) # Make Σ the size of A for i=1:length(σ) Σ[i,i]=σ[i] end # put the singular values on the diagonal display(A) U*Σ*V' Σ A = randn(3,5) U,σ,V = svd(A,thin=false) # thin=false gives the basic svd, # often the default (thin=true) is more useful display(U), display(σ), display(V) Σ = zeros(A) # Make Σ the size of A for i=1:length(σ) Σ[i,i]=σ[i] end # put the singular values on the diagonal U*Σ*V' A A Σ A = randn(5,3) U,σ,V = svd(A) # thin = true display(U) display(round(U'U,2)) display(A) U*Diagonal(σ)*V' A = randn(3,5) U,σ,V = svd(A) display(V) display(round(V'V,2)) display(A) U*Diagonal(σ)*V' using Images, Interact picture = download("http://web.mit.edu/jfrench/Public/gstrang.png") pimage = load(picture) p = Float64.(channelview(pimage)) # convert to an array pr,pg,pb = p[1,:,:],p[2,:,:],p[3,:,:] Ur,σr,Vr = svd(pr) Ug,σg,Vg = svd(pg) Ub,σb,Vb = svd(pb) [colorview(RGB,pg,0*pg,0*pg);colorview(RGB,0*pg,pg,0*pg);colorview(RGB,0*pg,0*pg,pg)] #Pkg.add("ImageMagick") using ImageMagick # Pkg.add("Plots") # Pkg.build("PlotlyJS") using Plots plotly() plot(σr, color=:red, yaxis=:log, legend=false) plot!(σg, color=:green, yaxis=:log) plot!(σb, color=:blue, yaxis=:log) using Interact @manipulate for k=slider(1:40,value=1) p̂r = Ur[:,1:k]*Diagonal(σr[1:k])*Vr[:,1:k]' p̂g = Ug[:,1:k]*Diagonal(σg[1:k])*Vg[:,1:k]' p̂b = Ub[:,1:k]*Diagonal(σb[1:k])*Vb[:,1:k]' img = colorview(RGB, p̂r,p̂g,p̂b) end pics = Dict{String,Array}() pics["Ireland"] = ImageMagick.load(download("https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/500px-Flag_of_Ireland.svg.png")) pics["USA"] = ImageMagick.load(download("https://upload.wikimedia.org/wikipedia/en/thumb/a/a4/Flag_of_the_United_States.svg/640px-Flag_of_the_United_States.svg.png")) pics["Klingon"] = ImageMagick.load(download("https://images-na.ssl-images-amazon.com/images/I/51ibu5dAb9L._SY550_.jpg")) @manipulate for flag in collect(keys(pics)), k=slider(1:40,value=1) p = float.(channelview(pics[flag])) # convert to an array pr,pg,pb = p[1,:,:],p[2,:,:],p[3,:,:] Ur,σr,Vr = svd(pr) Ug,σg,Vg = svd(pg) Ub,σb,Vb = svd(pb) p̂r = Ur[:,1:k]*Diagonal(σr[1:k])*Vr[:,1:k]' p̂g = Ug[:,1:k]*Diagonal(σg[1:k])*Vg[:,1:k]' p̂b = Ub[:,1:k]*Diagonal(σb[1:k])*Vb[:,1:k]' colorview(RGB, p̂r,p̂g,p̂b) end A = eye(5) svdvals(A) A = Diagonal(randn(5)) svdvals(A) # absolute value of diagonals # svdvals always are in monotonically non-increasing order Q,_ = qr(randn(5,5)) Q'Q svdvals(Q) # Q = Q * (Σ=I) * (V=I)' D = Diagonal(randn(5)) svdvals(Q*D) svdvals(D*Q) # Notice if A = U Σ V' then # A'A = U Σ V'V Σ' U' # A'A = V Σ² V' # A*A' = U Σ² U' A = randn(5,3) svdvals(A).^2 |> sort eigvals(A'A) |> sort eigvals(A*A') |> sort U,σ,V = svd(A) E,X = eig(A'A) display(X) V[:,5:-1:1] E,X = eig(A*A') display(X) U[:,5:-1:1] n(n-1)/2 + n + n(n-1)/2