evo*_*lue 2 optimization julia
我有一个用Julia编写的非常简单的函数,需要运行数百万次.
码:
function randfunc()
#rands could be a global variable if desired
rands = rand(200,100000)
for i=1:100000
#the alphabet can continue (and in Q1 as well)
# rand(1:100000) generates a random number within the number of columns in rands
a = rand(1:100000)
b = rand(1:100000)
c = rand(1:100000)
d = rand(1:100000)
e = rand(1:100000)
Q1 = hcat(rands[:,a],rands[:,b],rands[:,c],rands[:,d],rands[:,e])
Q2 = *(Q1.',Q1)
end
end
Run Code Online (Sandbox Code Playgroud)
有没有办法加快hcat功能或用更高效的东西取而代之?
加速这个功能的另一种方法是手动进行矩阵乘法而不构造Q1矩阵,但是内置*(,)算子运行速度比使用+'s和*'s 更快,至少在我的尝试中,这样做似乎有更多开销不仅仅是构建Q1.
使用rands = convert(Array{Float32}, rands)有点帮助,但Float16实际上更糟(特别是对于矩阵乘法).中的元素rands不能是严格的整数,并且列向量的数量在Q1中是任意的.
编辑:这个问题的最初概念是试图获得一种从数据中调用矩阵的快速方法,该数据随后将成为矩阵乘法及其转置的一部分.我编辑了代码以试图解决任何歧义.
旧代码:
function randfunc()
#rands could be a global variable if desired
rands = rand(200,100000)
for i=1:100000-1
Q1 = hcat(rands[:,[i]],rands[:,[i]].*rands[:,[i+1]])
Q2 = *(Q1.',Q1)
end
end
Run Code Online (Sandbox Code Playgroud)
此代码尝试通过将计算简化为两个嵌套for循环来优化函数.基本上,这通过根据输入rands矩阵元素扩展表达式来计算原始矩阵形式所表达的相同表达式.返回值是Q2矩阵的行列式的向量.
function randfunc2(rands)
a,b,c = 0.0,0.0,0.0
detvec = Vector{Float64}(size(rands,2)-1)
@inbounds for i=1:(size(rands,2)-1)
a,b,c = 0.0,0.0,0.0
@inbounds for j=1:size(rands,1)
s = rands[j,i]
t = s*s
u = s*rands[j,i+1]
a += t
b += s*u
c += u*u
end
detvec[i] = a*c-b*b # calc determinant using 2x2 det formula
# Q2 = [a b; b c]
end
return detvec
end
Run Code Online (Sandbox Code Playgroud)
要使用此功能,请在问题中的示例中:
rands = rand(200,100000)
randfunc2(rands) # this returns the determinant vectors.
Run Code Online (Sandbox Code Playgroud)
分配非常小,每个矩阵元素访问两次,但按列顺序(快速顺序).