Add: julia-0.6.2
Former-commit-id: ccc667cf67d569f3fb3df39aa57c2134755a7551
This commit is contained in:
81
julia-0.6.2/share/julia/test/linalg/svd.jl
Normal file
81
julia-0.6.2/share/julia/test/linalg/svd.jl
Normal file
@@ -0,0 +1,81 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user