【发布时间】:2015-07-26 02:46:45
【问题描述】:
我正在 Julia 0.4-prerelease 中尝试以下代码,它以两种不同的方式(精确与级数展开)执行矩阵求幂。我尝试使用几种方法来获取数组维度n 和设置单位矩阵eye( n )。
function test()
A = [ 1.0 -1.0 ; -1.0 1.0 ]
lam, U = eig( A ) # diagonalization: A U = U diagm(lam)
Bref = U * diagm( exp(lam) ) * U' # Bref = exp(A) (in matrix sense)
#[ Get the dimension n ]
n = length( lam ) # slow (1a)
# const n = length( lam ) # slow (1b)
# n::Int = length( lam ) # fast (1c)
# const n::Int = length( lam ) # fast (1d)
# n = size( A, 1 ) # fast (1e)
#[ Set unit matrices to B and X ]
B = eye( n ); X = eye( n ) # slow with (1a) (2-1)
# B = eye( 2 ); X = eye( 2 ) # fast (2-2)
# B = eye( n::Int ); X = eye( n::Int ) # fast (2-3)
# B::Array{Float64,2} = eye( n ); X::Array{Float64,2} = eye( n ) # fast (2-4)
# B = eye( A ); X = eye( A ) # fast (2-5)
#[ Calc B = exp(A) with Taylor expansion ]
@time for k = 1:20
X[:,:] = X * A / float( k )
B[:,:] += X
end
#[ Check error ]
@show norm( B - Bref )
end
test()
在这里我观察到,当 n 是动态变量(没有类型注释)时,代码变得比其他情况慢得多。例如,(1a) 和 (2-1) 的组合给出 下面的“慢”结果,而其他组合给出“快”结果(快 1000 倍以上)。
slow case => elapsed time: 0.043822985 seconds (1 MB allocated)
fast case => elapsed time: 1.1702e-5 seconds (16 kB allocated)
这是因为“类型不稳定”发生在 for 循环中吗?我很困惑,因为eye( n ) 始终是Array{Float64,2}(仅在初始化中使用)并且似乎没有(隐式)类型更改。同样令人困惑的是 (1e) 和 (2-1) 的组合速度很快,其中动态 n 设置为 size() 而不是 length()。总的来说,要获得良好的性能,显式注释数组维度变量会更好吗?
【问题讨论】:
标签: julia