2014-10-01 1 views
3

Julia에서 크기 N의 Riemann 행렬을 만들기위한 함수를 구현했습니다. Riemann 가설과 관련된 N-by-N 행렬입니다.Julia의 Riemann 행렬 함수 최적화

DET(A) = O(N! N^(-1/2+epsilon))epsilon > 0이고, DET()은 결정자를 나타내고, !은 계승을 나타낸다. 여기

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

잘 작동 내 코드이지만, 최적화 필요

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

, A = 리만 매트릭스

: 희망

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 
+0

질문이 무엇인지 분명하지 않습니다. – StefanKarpinski

+0

질문은 효율적인 메모리 사용과 최고의 속도를 위해 위 기능을 최적화하는 방법입니다. –

+0

'Int32'를'Int's로 만들었다면, 당신은 이것을 훨씬 빨리 얻을 수 있을지 의심 스럽습니다. 함수 밖에서 행렬을 할당하려고 제안하는'riemann! '버전과 비슷하지만 전체 시간은 변경되지 않습니다. – IainDunning

답변

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 
+0

아마 반환 값보다 큰'Array'를 할당 할 필요가 없다. 어느 정도 속도가 올라간다는 것을 알기 위해 당신에게 맡길 것입니다 – rickhg12hs

+0

많은 감사합니다, 이것은 나의 것보다 약 4.4 배 빠릅니다. 반환 값보다 큰 배열을 할당하는 것이 무슨 뜻인지는 분명하지 않습니다. ! R은 반환 값보다 하나의 행과 하나의 열로 더 큽니다 .' Int '와'Int32'의 차이점은 무엇입니까? 성능에 대해서는 –

+0

현재 R [2 : x + 1, 2 : x + 1]'은 복사본을 만들 것이므로 그 차이를 피할 수 있습니다. 'Int'는 32 비트 또는 64 비트를 사용하는지에 따라 'Int32'또는 'Int64'에 대한 'typealias' 줄리아. –