我在Julia中实现了一个函数,用于创建大小为N的Riemann矩阵。它是与Riemann假设相关联的N乘N矩阵,当且仅当:
DET(A) = O( N! N^(-1/2+epsilon))对于每个epsilon > 0,DET()表示行列式,!表示阶乘。
其中,A= Riemann矩阵
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发布于 2014-10-01 18:52:56
通过删除所有的测试(我们只需步进倍数),这样做的速度要快得多。
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
endhttps://stackoverflow.com/questions/26146552
复制相似问题