如何在Julia中提高Storkey的学习成绩?

时间:2020-10-21 05:40:38

标签: performance julia nested-loops quaternions complex-numbers

您好,我是这里的新手,而Julia 10.3中也是新手。如今,我正在研究不同数字系统中的Storkey学习规则。在我第一次尝试对这种想法进行编码时,我尝试了以下朴素代码:

id   status
1   InProgress
2   Completed
3   Pending

这是主要功能和

给出的“本地字段”
    function storkey_learning_first(U)
    
    # The memories are given by the columns
    row,col = size(U)
    
    # First W matrix
    W_new = zeros(row,row)
 
    for mu=1:col
        
        W_old = copy(W_new)

        for i=1:row
            for j=i:row 
                s = 0.0
                # Putting this value in the new matrix
                s += U[i,mu]*U[j,mu]
                s -= local_field_opt(W_old,U[:,mu],i,j,row)*U[j,mu]
                s -= local_field_opt(W_old,U[:,mu],j,i,row)*U[i,mu]
                s *= 1/row    
                
                W_new[i,j] += s
                W_new[j,i]  = W_new[i,j]
                
            end  
        end
        
    end

    return W_new
end

然后给定一个n维实值向量,两个代码都创建一个维数为(n x n)的矩阵。对于低维向量,它是有效的。但是对于高维数组,这确实很慢。实际上,我想存储维度n = 8192的向量。而且,我想使用维数较小的复数值向量或四元数,但在实际情况下我做不到更好。在第二次尝试中,我将完整的结构分为两个函数,特别是,我将两个内部循环分开,避免重复调用相同的元素:

function local_field_opt(W_old,U,i,j,row)

hij = 0.0

for k=1:row
    
    if k != i && k != j
    hij += W_old[i,k]*U[k]
    end
    
end
return  hij
end

与此同时,我获得了几秒钟。在这种情况下,如何改善语法?以及使用复数或四元数:这是否会带来相当大的额外负担?最后,到现在为止,我正在获取维度为n = 1352的向量的此时间标记:

function_inner(U,W_old,W_mu,mu,row)

# Calling one time the column
U_mu = U[:,mu]


for j=1:row
    U_j_mu = U[j,mu]
    
    for i=j:row 
        
        U_i_mu = U[i,mu]
        
        s = 0.0
        
        s += U_i_mu *U_j_mu
        s -= U_i_mu *local_field_opt(W_old,U_mu,j,i,row)
        s -= local_field_opt(W_old,U_mu,i,j,row)*U_j_mu
        s *= 1/row    

        W_mu[i,j] += s
        W_mu[j,i]  = W_mu[i,j]
    end  
end    
return W_mu 
end

0 个答案:

没有答案