2017-04-05 71 views
1

學習序列的產品,從Python的傳遞到朱莉婭,我想轉換的舊代碼,我有,就是計算這個表達的序列的產品:朱莉婭:以量化的方式

enter image description here

我在Python中有兩個版本的代碼,一個使用for循環實現,另一個使用廣播。該for循環的版本是:

import numpy as np 
A = np.arange(1.,5.,1) 
G = np.array([[1.,2.],[3.,4.]]) 

def calcF(G,A): 
    N = A.size 
    print A 
    print N 
    F = [] 
    for l in range(N): 
     F.append(G/A[l]) 
     print F[l] 
     for j in range(N): 
      if j != l: 
       F[l]*=((G - A[l])/(G + A[j]))*((A[l] - A[j])/(A[l] + A[j])) 
    return F 

F= calcF(G,A) 
print F 

而且矢量版本我已經從我的問題here響應瞭解到,這個函數:

def calcF_vectorized(G,A): 
    # Get size of A 
    N = A.size 

    # Perform "(G - A[l])/(G + A[j]))" in a vectorized manner 
    p1 = (G - A[:,None,None,None])/(G + A[:,None,None]) 

    # Perform "((A[l] - A[j])/(A[l] + A[j]))" in a vectorized manner 
    p2 = ((A[:,None] - A)/(A[:,None] + A)) 

    # Elementwise multiplications between the previously calculated parts 
    p3 = p1*p2[...,None,None] 

    # Set the escaped portion "j != l" output as "G/A[l]" 
    p3[np.eye(N,dtype=bool)] = G/A[:,None,None] 

    Fout = p3.prod(1) 

    # If you need separate arrays just like in the question, split it 
    return np.array_split(Fout,N) 

我試圖天真地翻譯了Python for循環代碼朱莉婭:

function JuliacalcF(G,A) 
    F = Array{Float64}[] 
    for l in eachindex(A) 
     push!(F,G/A[l]) 
     println(A[i]) 
     for j in eachindex(A) 
      if j!=l 
       F[l]*=((G - A[l])/(G + A[j]))*((A[l] - A[j])/(A[l] + A[j])) 
      end 
     end 
    end 
    #println(alpha) 
    return F 
end 
A = collect(1.0:1.0:5.0) 
G = Vector{Float64}[[1.,2.],[3.,4.]] 
println(JuliacalcF(G,A)) 

但是,有沒有辦法做到這一點很巧妙地作爲轉播numpy g矢量化版本?

+2

你確定你需要一個矢量化的版本嗎?如果你對性能感興趣(和_probably_ vectorizing),我會先推薦你[profile](http://docs.julialang.org/en/stable/stdlib/profile/)你的代碼,並看看[performance提示](http://docs.julialang.org/en/stable/manual/performance-tips/) –

回答