memoize
함수 핸들에 메모이제이션 의미 체계 추가
설명
메모이제이션은 프로그램이 동일한 입력값으로 호출될 때 메모리를 많이 차지하는 함수 호출 결과를 캐시하고 캐시된 결과를 반환하여 프로그램 속도를 높이는 최적화 기법입니다.
다음 항목이 모두 해당하는 경우 함수 호출에 대한 메모이제이션을 적용해 보십시오.
높은 성능을 내는 것이 중요합니다.
함수에 많은 시간이 소요됩니다.
함수는 전적으로 입력값에 의해 결정되는 반환 값을 가지며, 부수 효과가 없습니다.
시스템 메모리가 고유한 입력값과 출력값 조합을 저장할 수 있을 만큼 충분합니다.
memoizedFcn = memoize(
는 입력 함수 핸들에 메모이제이션 의미 체계를 추가하며, fh
)MemoizedFunction
객체를 반환합니다. fh
를 불러오듯이 memoizedFcn
을 불러옵니다. 그러나 memoizedFcn
은 함수 핸들이 아닙니다.
MemoizedFunction
객체는 입력값의 캐시와 이에 대응하는 출력값을 유지합니다. 이를 불러오면 MATLAB®은 다음 조건이 충족되는 경우 연결된 캐시된 출력값을 반환합니다.
입력 인수는 수치상으로 캐시된 입력값과 동일합니다. 입력값을 비교할 때 MATLAB은
NaN
을 같은 값으로 취급합니다.요청된 출력 인수의 수는 이러한 입력값과 연결된 캐시된 출력값의 수와 일치합니다.
함수의 메모이제이션은 MemoizedFunction
객체가 아닌, 입력 함수와 연결됩니다. 따라서 다음 사항을 기억하십시오.
동일한 함수에 대한 새
MemoizedFunction
객체를 생성하면 동일한 데이터에 대한 다른 참조가 만들어집니다. 동일한 함수를 메모이제이션하는 두 변수는 캐시와 객체 속성값(예: 캐시 크기)을 공유합니다. 다음 예에서, 변수a
와b
는 캐시를 공유하며, 동일한 캐시 크기 값을 가집니다.마찬가지로,a = memoize(@svd); b = memoize(@svd);
b
(b.clearCache
)의 캐시를 지우면a
의 캐시와,svd
함수에 대해 메모이제이션을 적용하는 다른 모든 변수도 지워집니다.clearCache
는MemoizedFunction
객체 함수입니다.MemoizedFunction
객체를 새 변수에 할당하면 동일한 데이터에 대한 다른 참조가 만들어집니다. 다음 예에서, 변수c
와d
는 데이터를 공유합니다.c = memoize(@svd); d = c;
변수를 지워도 해당 입력 함수와 연결된 캐시는 지워지지 않습니다. 작업 공간에 더 이상 존재하지 않는
MemoizedFunction
객체의 캐시를 지우려면 동일한 함수에 대한 새MemoizedFunction
객체를 만들고, 이 새 객체에clearCache
함수를 사용하십시오. 또는,clearAllMemoizedCaches
함수를 사용하여 모든MemoizedFunction
객체의 캐시를 지울 수 있습니다.
주의
MemoizedFunction
객체는 기본 함수에 대한 업데이트를 인식하지 못합니다. 메모이제이션이 적용된 함수와 연결된 함수를 수정하는 경우 clearCache
객체 함수로 캐시를 지우십시오.
예제
입력 인수
팁
동일한 함수 핸들로
memoize
를 여러 번 호출하면 동일한MemoizedFunction
객체가 반환됩니다. 예를 들면 다음과 같습니다.x = memoize(@plus); y = memoize(@plus); x == y
ans = logical 1
어떤 전역 상태를 설정하거나 I/O 작업을 수행하는 등의 부수 효과를 갖는 함수에는 메모이제이션을 적용하면 안 됩니다. 부수 효과는 동일한 입력값을 가진 메모이제이션이 적용된 함수에 대한 후속 호출 시 반복되지 않습니다. 예를 들어,
randi
함수에 메모이제이션을 적용하는 경우 이 함수는 동일한 입력 인수로 호출 시 항상 동일한 값을 반환합니다.fh = @randi; memoized_fh = memoize(fh); fh_result = [fh(100) fh(100) fh(100)] memoized_result = [memoized_fh(100) memoized_fh(100) memoized_fh(100)]
fh_result = 18 71 4 memoized_result = 28 28 28
버전 내역
R2017a에 개발됨