簡體   English   中英

從 function 收集值到 Julia

[英]Collect values from function in Julia

我的問題是關於 Julia 廣播運營商的使用。

假設我有以下對象

M = [0.7 0.3; 0.4 0.6];
x0 = [100 100];
N=5;
y = zeros(N, size(x0)[2]);

function Markov_bling_bling(;Trans_mat, initial_states, n_ahead)
    # Define useful names
    M = Trans_mat; x0 = initial_states; N = n_ahead;
    # Compute the N-th state 
    xn = x0 * M^N
    return(x_n = xn)
end

(對不起這個愚蠢的名字)

所以這個 function 返回一個 1x2 向量。

所以我想將每個xn作為一行存儲在y中。

在 R 中,我會這樣做:

y <- list()
for(t in 1:(N+1)){
  y[t] = Markov_bling_bling(Trans_mat = M, initial_states = x0, n_ahead=(t-1))
}

y <- Reduce(rbind,x)

我如何在 Julia 中完成此操作? 我知道我必須使用廣播運算符以避免for loop

但我仍然不知道如何存儲結果,我應該定義y = []嗎? Julia 存儲結果的方式是什么?

提前致謝!

它可以用與 R 幾乎相同的方式編寫:

julia> reduce(vcat, [Markov_bling_bling(Trans_mat = M, initial_states = x0, n_ahead=(t-1)) for t in 1:N])
5×2 Matrix{Float64}:
 100.0   100.0
 110.0    90.0
 113.0    87.0
 113.9    86.1
 114.17   85.83

Bogumił 的回答是更好的直接翻譯,但我可以建議一個更有效的版本:

julia> function blingblings(x0, M, N)
           ys = similar(x0, size(x0, 2), N)
           ys[:, 1] = x0
           for i = 2:N
               ys[:, i] = ys[:, i-1]' * M
           end
           return ys
       end
blingblings (generic function with 1 method)

julia> blingblings(x0, M, 5)
2×5 Matrix{Float64}:
 100.0  110.0  113.0  113.9  114.17
 100.0   90.0   87.0   86.1   85.83

最重要的是,這避免了每次求冪的二次復雜性,並且更好地尊重 Julia arrays 的列優先性質。 for 循環沒有錯。

(我想發布一個使用accumulate的解決方案,但不幸的是,它的init參數並沒有像我預期的那樣以結果結尾,這使得該解決方案不符合您的要求:

julia> ys = accumulate(1:5; init=x0) do y, _
           (y * M)::Matrix{Float64}
       end
5-element Vector{Matrix{Float64}}:
 [110.0 90.0]
 [113.0 87.0]
 [113.89999999999999 86.1]
 [114.16999999999999 85.82999999999998]
 [114.25099999999998 85.74899999999998]

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM