gpt4 book ai didi

optimization - 优化 Julia 中的连接

转载 作者:行者123 更新时间:2023-12-03 17:05:55 24 4
gpt4 key购买 nike

我有一个用 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

有什么方法可以加快 hcat 函数的速度或用更高效的东西代替它吗?

加速此函数的另一种方法是手动执行矩阵乘法而不构造 Q1 矩阵,但内置的 *(,) 运算符比使用 +< 运行得更快*,至少在我的尝试中,这样做似乎比简单地构建 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

最佳答案

此代码试图通过将计算简化为两个嵌套的 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

要使用此功能,如问题中的示例所示:

rands = rand(200,100000)
randfunc2(rands) # this returns the determinant vectors.

分配非常少,每个矩阵元素被访问两次但按列顺序(这是快速顺序)。

关于optimization - 优化 Julia 中的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com