[英]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.