Files
jitty-scripts/julia-0.6.3/share/julia/test/linalg/svd.jl
mollusk 0e4acfb8f2 fix incorrect folder name for julia-0.6.x
Former-commit-id: ef2c7401e0876f22d2f7762d182cfbcd5a7d9c70
2018-06-11 03:28:36 -07:00

82 lines
2.8 KiB
Julia
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This file is a part of Julia. License is MIT: https://julialang.org/license
using Base.Test
using Base.LinAlg: BlasComplex, BlasFloat, BlasReal, QRPivoted
n = 10
# Split n into 2 parts for tests needing two matrices
n1 = div(n, 2)
n2 = 2*n1
srand(1234321)
areal = randn(n,n)/2
aimg = randn(n,n)/2
a2real = randn(n,n)/2
a2img = randn(n,n)/2
@testset for eltya in (Float32, Float64, Complex64, Complex128, Int)
aa = eltya == Int ? rand(1:7, n, n) : convert(Matrix{eltya}, eltya <: Complex ? complex.(areal, aimg) : areal)
aa2 = eltya == Int ? rand(1:7, n, n) : convert(Matrix{eltya}, eltya <: Complex ? complex.(a2real, a2img) : a2real)
asym = aa'+aa # symmetric indefinite
apd = aa'*aa # symmetric positive-definite
@testset for atype in ("Array", "SubArray")
if atype == "Array"
a = aa
a2 = aa2
else
a = view(aa, 1:n, 1:n)
a2 = view(aa2, 1:n, 1:n)
end
ε = εa = eps(abs(float(one(eltya))))
usv = svdfact(a)
@testset "singular value decomposition" begin
@test usv[:S] === svdvals(usv)
@test usv[:U] * (Diagonal(usv[:S]) * usv[:Vt]) a
@test AbstractArray(usv) a
@test usv[:Vt]' usv[:V]
@test_throws KeyError usv[:Z]
b = rand(eltya,n)
@test usv\b a\b
if eltya <: BlasFloat
svdz = svdfact!(ones(eltya,0,0))
@test svdz[:U] eye(eltya,0,0)
@test svdz[:S] real(zeros(eltya,0))
@test svdz[:Vt] eye(eltya,0,0)
end
end
@testset "Generalized svd" begin
a_svd = a[1:n1, :]
gsvd = svdfact(a,a_svd)
@test gsvd[:U]*gsvd[:D1]*gsvd[:R]*gsvd[:Q]' a
@test gsvd[:V]*gsvd[:D2]*gsvd[:R]*gsvd[:Q]' a_svd
@test usv[:Vt]' usv[:V]
@test_throws KeyError usv[:Z]
@test_throws KeyError gsvd[:Z]
@test gsvd[:vals] svdvals(a,a_svd)
α = eltya == Int ? -1 : rand(eltya)
β = svdfact(α)
@test β[:S] == [abs(α)]
@test svdvals(α) == abs(α)
u,v,q,d1,d2,r0 = svd(a,a_svd)
@test u gsvd[:U]
@test v gsvd[:V]
@test d1 gsvd[:D1]
@test d2 gsvd[:D2]
@test q gsvd[:Q]
@test gsvd[:a].^2 + gsvd[:b].^2 ones(eltya,length(gsvd[:a]))
#testing the other layout for D1 & D2
b = rand(eltya,n,2*n)
c = rand(eltya,n,2*n)
gsvd = svdfact(b,c)
@test gsvd[:U]*gsvd[:D1]*gsvd[:R]*gsvd[:Q]' b
@test gsvd[:V]*gsvd[:D2]*gsvd[:R]*gsvd[:Q]' c
end
end
end