julia1.0中循环速度的改进

julia1.0中循环速度的改进,julia,Julia,我有一个长向量V和一个大矩阵M。我的目的是在下面的Julia代码中 using LinearAlgebra function myfunction(M,V) n = size(V,1) sum = 0 summ = 0 for i = 1:n-1 for j = i+1:n a= [i,j] Y = V[a] X = M[a,a] sum += Y'*i

我有一个长向量V和一个大矩阵M。我的目的是在下面的Julia代码中

using LinearAlgebra
function myfunction(M,V)
    n = size(V,1)
    sum = 0
    summ = 0
    for i = 1:n-1
        for j = i+1:n
            a= [i,j]
            Y = V[a]
            X = M[a,a]
            sum += Y'*inv(X)*Y
            summ += tr(X)*Y'*Y
        end
    end
return sum, summ
end

因为向量很长,矩阵很大,所以这个过程需要很长时间。我在这个问题上花了很长时间。我真的很感谢你的帮助

我只是手动展开计算以避免分配:

function myfunction2(M::AbstractMatrix{T},V::AbstractVector{T}) where {T}
    n = size(V, 1)
    sum = zero(T)
    summ = zero(T)
    for i = 2:n
        for j = 1:i-1
            @inbounds y1, y2 = V[i], V[j]
            y11 = y1*y1
            y12 = y1*y2
            y22 = y2*y2
            @inbounds a, b, c, d = M[i,i], M[i,j], M[j,i], M[j,j]
            sum += (d*y11-(c+b)*y12+a*y22) / (a*d-b*c)
            summ += (a+d)*(y11+y22)
        end
    end
    return sum, summ
end
(注意,我对
M
V
做出了明确的假设)

编辑这是最快的

function myfunction3(M::AbstractMatrix{T},V::AbstractVector{T}) where {T}
    n = size(V, 1)
    sum = zero(T)
    summ = zero(T)
    for i = 2:n
        @inbounds y1 = V[i]
        @inbounds a = M[i,i]
        y11 = y1*y1
        for j = 1:i-1
            @inbounds y2 = V[j]
            y12 = y1*y2
            y22 = y2*y2
            @inbounds b, c, d = M[i,j], M[j,i], M[j,j]
            sum += (d*y11-(c+b)*y12+a*y22) / (a*d-b*c)
            summ += (a+d)*(y11+y22)
        end
    end
    return sum, summ
end

谢谢你的回复!这很有帮助。我只是想知道并行计算或线程是否会在这方面有所帮助?由于矩阵非常大,你可以使用我在回答另一个问题时向你展示的类似方法。
function myfunction3(M::AbstractMatrix{T},V::AbstractVector{T}) where {T}
    n = size(V, 1)
    sum = zero(T)
    summ = zero(T)
    for i = 2:n
        @inbounds y1 = V[i]
        @inbounds a = M[i,i]
        y11 = y1*y1
        for j = 1:i-1
            @inbounds y2 = V[j]
            y12 = y1*y2
            y22 = y2*y2
            @inbounds b, c, d = M[i,j], M[j,i], M[j,j]
            sum += (d*y11-(c+b)*y12+a*y22) / (a*d-b*c)
            summ += (a+d)*(y11+y22)
        end
    end
    return sum, summ
end