新尝试写的程序出现了一点问题,还望大家能帮忙看下。
module Jacobi_SVD
export jacobi_SVD
using  Base.Threads
#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
            Threads.@threads for p in 1:r1
                local σ::Int64 = Threads.threadid()
				#println("the Thread id is $σ")
				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
            Threads.@threads for p in 1:r2
                local σ = Threads.threadid()
                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
上面的程序跑的时候在并行段会出现UndefVarError的错误警告,错误为
Error thrown in threaded loop on thread 0: UndefVarError(var:=i)
希望大家能帮我看下到底是哪里出了问题