# 「新手入门」程序调试

#1

``````module Jacobi_SVD

export jacobi_SVD

#include("IO.jl")

const num = 8
const ϵ = 1.e-8

function sgn(num::Float64)
if num == 0
return 0.0
else
ans = num > 0.0 ? 1.0 : -1.0
end

ans

end

function jacobi_SVD(U_t,M::Int,N::Int) #Matrix for SVD - One side JAC

#U_t = A
V_t = [i == j ? 1.0 : 0.0 for i in 1:M, j in 1:N]
I1 = zeros(Int64,N)
I2 = zeros(Int64,N)
C = zeros(100)
S = zeros(min(M, N))

acum::Int64 = 0
converge::Float64 = 1.0

while converge > ϵ

println(converge) # Test
converge = 0.0

acum += 1 #counter for loops

for l in 1:M
r1::Int64, r2::Int64= 0,0
for i in 1:M-l
if i % (2*l) < l
r1 += 1
I1[r1] = i
else
r2 += 1
I2[r2] = i
end
end

for k in 1:num
C[k] = converge
end

i = I1[p]
j = i + l
α::Float64, β::Float64, γ::Float64 = 0.0,0.0,0.0
for k in 1:N
#i = global i
α = α + (U_t[i,k] * U_t[i,k])
β = β + (U_t[j,k] * U_t[j,k])
γ = γ + (U_t[i,k] * U_t[j,k])
end
C[σ] = max(C[σ], abs(γ)/sqrt(α * β))

ζ = (β - α) / (2.0 * γ)
t = sgn(ζ) / (abs(ζ) + sqrt(1.0 + (ζ * ζ)))
c = 1.0 / (sqrt(1.0 + (t * t)))
s = c * t

for k in 1:N

t = U_t[i,k]
U_t[i,k] = c*t - s*U_t[j,k]
U_t[j,k] = s*t + c*U_t[j,k]

t = V_t[i,k]
V_t[i,k] = c*t - s*V_t[j,k]
V_t[j,k] = s*t + c*V_t[j,k]

end
end

i = I1[p],j = i + l
α, β, γ = 0.0
for k in 1:N
#i = global i
α = α + (U_t[i,k] * U_t[i,k])
β = β + (U_t[j,k] * U_t[j,k])
γ = γ + (U_t[i,k] * U_t[j,k])
end
C[σ] = max(C[σ], abs(γ)/sqrt(α * β))

ζ = (β - α) / (2.0 * γ)
t::Float64 = sgn(ζ) / (abs(ζ) + sqrt(1.0 + (ζ * ζ)))
c::Float64 = 1.0 / (sqrt(1.0 + (t * t)))
s::Float64 = c * t

for k in 1:N
#i = global i

t = U_t[i,k]
U_t[i,k] = c*t - s*U_t[j,k]
U_t[j,k] = s*t + c*U_t[j,k]

t = V_t[i,k]
V_t[i,k] = c*t - s*V_t[j,k]
V_t[j,k] = s*t + c*V_t[j,k]

end
end

for k in 1:num
converge = max(converge,C[k])
end

#for k in 0:num
end
end

#get Matrix S.Singular Value
for i in 1:M
t = 0
for j in 1:N
t = t + (U_t[i,j] * U_t[i,j])
end
t = sqrt(t)

for j in 1:N
U_t[i,j] = U_t[i,j] / t
if i == j
S[i] = t
end
end
end

U = zeros(M,N)
V = zeros(M,N)
for i in 1:M
for j in 1:N
U[i,j] = U_t[j,i]
V[i,j] = V_t[j,i]
end
end

U,S,V #Output the U S V -Three Matrices

end

A = rand(20,18)

#IO.matrix_print(A)

U,S,V = jacobi_SVD(A,20,18)

#println(sgn(-187.0))

end
``````

``````Error thrown in threaded loop on thread 0: UndefVarError(var:=i)
``````

2 posts were merged into an existing topic: 「新手入门」关于变量作用域的小问题