在Julia中优化连接

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)

Dan*_*etz 5

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

分配非常小,每个矩阵元素访问两次,但按列顺序(快速顺序).