2014-09-18 2 views
3

이것은 일반적인 알고리즘 질문이지만 내 주 환경은 Matlab입니다.동일한 인수를 사용하여 반복 호출 시뮬레이션/함수 피하기

제가

함수를

아웃 = F (ARG1, ARG2을 ,, .....)을 실행하는 데 시간이 걸리고 (즉 클러스터 시간) 계산이 비싸다

있다. 주어진 인수 argn은 문자열, 정수, 벡터 및 함수 핸들 일 수도 있습니다.

이와 같은 이유 때문에 동일한 인수 값에 대해 f (args)를 호출하지 않는 것이 좋습니다. 내 프로그램 내에서 이것은 프로그래머가 반드시 제어 할 수없는 방식으로 발생할 수 있습니다.

그래서 args의 가능한 값마다 f()를 한 번 호출하고 결과를 디스크에 저장하려고합니다. 그런 다음 다음 번에 호출 될 때마다 해당 인수 값에 대한 결과가 현재 있는지 확인하십시오. 그렇다면 디스크에서로드합니다.

나의 현재 아이디어는 각 함수 호출마다 하나의 행을 가진 셀 변수를 만드는 것이다. 첫 번째 열에 있습니다. 열 2에서 : N은 argn의 값이고, 각각의 등가성을 검사합니다.

변수 유형이 다양하기 때문에 어떻게해야합니까?

더 좋은 알고리즘이 있습니까?

더 일반적으로 사람들은 시뮬레이션 결과를 디스크에 저장하고 메타 데이터를 저장하는 방법을 어떻게 다룹니까? (파일 이름에 모든 것을 주입식이 아닌!)

+3

한 마디로 메모 작성을 구현하려고합니다. – Jommy

+0

감사합니다. 하나의 키워드가 내 검색을 대단히 도움이되었습니다! –

답변

1

당신은 이런 식으로 뭔가 보이는 기능을 구현할 수 있습니다

function result = myfun(input) 

persistent cache 

if isempty(cache) 
    cachedInputs = []; 
    cachedOutputs = []; 
    cache = {cachedInputs, cachedOutputs}; 
end 

[isCached, idx] = ismember(input, cache{1}); 

if isCached 
    result = cache{2}(idx); 
else 
    result = doHardThingOnCluster(input); 
    cache{1}(end+1) = input; 
    cache{2}(end+1) = result; 
end 

이 간단한 예제는 당신의 입력과 출력에 저장할 수 있습니다 모두 스칼라 숫자가 있다고 가정을 배열. 문자열을 처리해야하거나 더 복잡한 것이면 배열이 아닌 캐싱을 위해 셀 배열을 사용할 수 있습니다. 실제로는 containers.Map 일 수도 있습니다. 또는 대용량 결과를 캐시해야하는 경우 파일에 저장하고 파일 이름을 캐싱 한 다음 캐싱 된 파일을로드하는 것이 좋습니다.

희망 하시겠습니까?

관련 문제