Julia中的Riemann矩阵函数优化

时间:2014-10-01 16:58:42

标签: matrix compiler-optimization julia

我在Julia中实现了一个函数来创建一个大小为N的Riemann矩阵。它是一个与Riemann假设相关的N-by-N矩阵,当且仅在以下情况下为真:

每个DET(A) = O( N! N^(-1/2+epsilon))

epsilon > 0DET()表示行列式,!表示阶乘。

其中,A =黎曼矩阵,

A = B(2:N+1, 2:N+1),其中

B(i,j) = i-1 if i divides j, and
          -1 otherwise.

这是我的代码工作正常,但需要优化:

function riemann(x::Int32)
    R = zeros(Int32,x+1,x+1)
    for i=1:x+1, j=1:x+1
        if j%i == 0
           R[i,j] = i-1
        else
           R[i,j] = -1
        end
    end
    return R[2:x+1,2:x+1]
end

希望我需要以更高效的形式编写它,如:

function riemann!{T}(R::AbstractMatrix{T}, x::T)
.
.
.

任何建议都表示赞赏。

编辑:

嗯,这是我上面建议的另一种形式。我把它与原始代码计时并没有发现速度增益。

function calc_riemann!{T}(R::AbstractMatrix{T}, x::T)
    for i=1:x+1, j=1:x+1
        if j%i == 0
           R[i,j] = i-1
        else
           R[i,j] = -1
        end
    end
end
function riemann(x::Int)
    R = Array(Int, x+1,x+1)
    calc_riemann!(R, x)
    y = R[2:x+1,2:x+1]
end

1 个答案:

答案 0 :(得分:3)

通过删除所有测试,我们可以更快地完成这项工作(我们可以直接进入倍数)。

function my_riemann(x::Int)
    R = Array(Int,x+1,x+1)
    fill!(R,-1)
    for i=2:x+1
        for j=i:i:x+1
            R[i,j] = i - 1
        end
    end
    return R[2:x+1,2:x+1]
end

<强> 修改

是的,分配正确的大小Array而不是复制它会大大加快速度。看看你的这个版本的时间是否大大减少了。

function my_riemann2(x::Int)
    R = Array(Int,x,x)
    fill!(R,-1)
    for i=1:x
        for j=i:i+1:x
            R[i,j] = i
        end
    end
    return R
end