2016-11-02 2 views
1

나는 많은 계승을 반복해서 계산하는 코드를 최적화하고 있습니다. 호출은 몇 가지 다른 함수에서 왔으므로이 함수가 각 함수에 대한 인수로 미리 계산 된 계승 값을 배열에주는 것을 피하고자했습니다. 그러나 이것이 가장 빠른 방법이라고 생각합니다.계승의 사용을 최적화하는 matlab

전역 변수를 사용하는 것이 더 효과적이지만, 글로벌 변수 로딩이 계승의 계산만큼 오래 걸리므로 예상만큼 빠르지는 않습니다.

function [ facn ] = cfactorial(n) 

global facs 

if n > 170 
    facn = Inf; 
elseif n == 0 
    facn = 1; 
else 
    facn = facs(n); 
end 

또한 영구적으로 설정해 보았습니다. 그리 빠른 것도 아닙니다.

function [ facn ] = cfactorial(n) 

persistent facs 

if isempty(facs) 
    load('facs.mat') 
    facs = faccs; 
end 

if n > 170 
    facn = Inf; 
elseif n == 0 
    facn = 1; 
else 
    facn = facs(n); 
end 

"persistent facs"줄이 둘 다 있습니다. "글로벌 facs"이제는 프로파일 러에서 대부분의 시간이 걸립니다.

다른 방법이 있습니까? 변수를로드하지 않고 전역 적으로 사용할 수있는 변수를 정의 할 수 있습니까?

+0

를 왜 모든 값의 배열을 미리 계산 해달라고 그런 다음 거기에서 그들을 얻을 수 있습니까? – mpaskov

+0

그게 내가하는 일이다. 나는 모든 기능들 사이에서 배열을 공유하는 효율적인 방법을 찾고있다. 지금 당장 나는 그 배열을 지나가는 추가 인수를 추가했다. 그러나 그것은 내가 피하고 싶었던 것이다. 나는 내가 아직 모르는보다 우아하고 효율적인 방법이 있다면 대부분 관심이있다. – kili

+0

내장 된 감마 기능을 사용하는 것은 어떻습니까? –

답변

3

함수를 호출하지 않고 가능한 한 많이 if..else을 사용하십시오. 벡터 라이 제이션이 더 나은 방법입니다. 이 같은 요인 매트릭스를 만들 수 있습니다

f_ns = factorials(min(ns, 171) + 1) ; 
:

factorials = [1 cumprod(1:170) Inf]; 

당신이 계승에게 n의의 값을 5 번 호출한다고 가정

ns = [3 0 56 23 456]; 

그래서 당신이 울부 짖는 소리로 계승를 얻을 수 있습니다

그러면 f_ns의 값으로 계산을 계속합니다. 당신이 facn 여러 번 요인으로하여 여러개의 계산을 필요로하는 함수 내에서 인라인 함수 facn를 생성하고 호출 할 수 f_ns 당신이 사전에 계산 할 수없는 경우

는 :

function myfunction 
    factorials = [1 cumprod(1:170) Inf]; 
    facn [email protected](n) factorials(min(n, 171) + 1) ; 
    facn(3); 
    facn(0); 
    facn(456); 
end 
+0

if..else를 f_ns = factorials (min (ns, 171) +1)로 바꾸십시오. 좋은 생각 같아. 중첩 된 함수 호출이 많은 곳에서 [외부 함수] (http://massey.dur.ac.uk/jdp/code.html#angmom)를 사용하고 있습니다. 따라서 사용하려고하면 벡터화하기가 어렵습니다. 그.어쩌면 나는 그것들을 직접 써서 그것을 최적화 할 것이다. – kili

관련 문제