Matrix Julia中的Riemann矩阵函数优化

Matrix Julia中的Riemann矩阵函数优化,matrix,compiler-optimization,julia,Matrix,Compiler Optimization,Julia,我在Julia中实现了一个函数,用于创建大小为N的Riemann矩阵。它是一个与Riemann假设相关的N×N矩阵,当且仅当: DET(A)=O(N!N^(-1/2+epsilon))对于每个epsilon>0,DET()表示行列式,表示阶乘 式中,A=黎曼矩阵,带 A=B(2:N+1,2:N+1),其中 B(i,j) = i-1 if i divides j, and -1 otherwise. 以下是我的代码,它运行良好,但需要优化: function riemann(

我在Julia中实现了一个函数,用于创建大小为N的Riemann矩阵。它是一个与Riemann假设相关的N×N矩阵,当且仅当:

DET(A)=O(N!N^(-1/2+epsilon))
对于每个
epsilon>0
DET()
表示行列式,
表示阶乘

式中,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

通过删除所有的测试(我们只需一步一步地进行多次测试),这样做的速度要快得多

编辑

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

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

我不清楚问题是什么。问题是如何优化上述函数以实现高效内存使用和最高速度。如果您将
Int32
s转换为
Int
s,我怀疑您是否可以更快地完成此操作。它看起来像是用
riemann版本您建议将矩阵分配到函数之外,但这不会改变总时间。对,我实施了
riemann!(…
form而不会获得任何额外的速度。请参阅我更新的帖子。还有其他建议吗?可能不需要分配一个大于返回值的
数组。我将把它留给您,看看这是否会大大加快速度。非常感谢,这比我的大约快4.4倍。我不清楚您分配的是什么意思比返回值大的数组!我看到R只比返回值大一行一列。还有
Int
Int32
之间的区别是什么?我的意思是在性能上。目前,
R[2:x+1,2:x+1]
将创建一个副本,因此避免这样做确实会产生影响。
Int
将是
Int32
Int64
typealias,这取决于您使用的是32位还是64位julia。因此,这与性能无关。这只是出于兼容性的原因。似乎您愿意提交给另一个和你不同的人写代码。我说的对吗?嗯@rickhg12hs,比我原来的代码快9.4倍。不幸的是,我仍然没有足够的信用给你投票!!非常感谢。
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