【发布时间】:2021-04-03 01:05:11
【问题描述】:
我正在使用 Julia 复制最初在 Matlab 中制作的一系列步骤。在 Octave 中,此过程需要 1.4582 秒,而在 Julia(使用 Jupyter)中,大约需要 10 秒。我会尽量在脚本中保持简短。我的目标是达到或提高 Octave 的性能。首先,我将描述我的变量和一些函数:
- zgrid(双 1x7 尺寸)
- kgrid(双倍 500x1 尺寸)
- V0(双倍 500x7 尺寸)
- P(双 7x7 大小)一个转换矩阵
- delta 和 beta 是固定参数。
- F(z,k) 和 u(c) 是特殊函数,在 Julia 脚本中指定。
% Octave script
% V0 is given
[K, Z, K2] = meshgrid(kgrid, zgrid, kgrid);
K = permute(K, [2, 1, 3]);
Z = permute(Z, [2, 1, 3]);
K2 = permute(K2, [2, 1, 3]);
C = max(f(Z,K) + (1-delta)*K - K2,0);
U = u(C);
EV = V0*P';% EV is a 500x7 matrix size
EV = permute(repmat(EV, 1, 1, 500), [3, 2, 1]);
H = U + beta*EV;
[TV, index] = max(H, [], 3);
在 Julia 中,我创建了一个复制此过程的函数。我使用了循环,但它的性能要长 9 倍。
% Julia script
% V0 is the input of my T operator function
V0 = repeat(sqrt.(kgrid), outer = [1,7]);
F = (z,k) -> exp(z)*(k^α);
u = (c) -> (c^(1-μ) - 1)/(1-μ)
% parameters
α = 1/3
β = 0.987
δ = 0.012;
μ = 2
Kss = 48.1905148382166
kgrid = range(0.75*Kss, stop=1.25*Kss, length=500);
zgrid = [-0.06725382459813659, -0.044835883065424395, -0.0224179415327122, 0 , 0.022417941532712187, 0.04483588306542438, 0.06725382459813657]
function T(V)
E=V*P'
T1 = zeros(Float64, 500, 7 )
aux = zeros(Float64, 500)
for i = 1:7
for j = 1:500
for l = 1:500
c= maximum( (F(zrid[i],kgrid[j]) +(1-δ)*kgrid[j] - kgrid[l],0))
aux[l] = u(c) + β*E[l,i]
end
T1[j,i] = maximum(aux)
end
end
return T1
end
我非常想提高我在 Julia 中的表现。我相信有办法改进,但我是 Julia 编程新手。
【问题讨论】:
-
您的 Julia 代码有错误。括号不匹配
-
另外,为什么
aux的长度为5000,而您似乎只访问它的第一个500元素? -
另外,
kgrid和zrid是在哪里定义的? -
如果它们是
global变量,那可能是问题的一部分 -
u 和 F 函数取决于其他校准参数。为了不加载脚本,我决定不完全指定它们。
标签: performance matlab julia