Matrix Julia中的Riemann矩阵函数优化
我在Julia中实现了一个函数,用于创建大小为N的Riemann矩阵。它是一个与Riemann假设相关的N×N矩阵,当且仅当: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(
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