사전할당(Preallocation)
루프를 돌 때마다 데이터 구조의 크기를 증분식으로 늘리는 for
와 while
루프는 성능과 메모리 사용에 부정적인 영향을 미칠 수 있습니다. 배열의 크기를 반복적으로 조정하면 MATLAB®에서 더 큰 연속 메모리 블록을 찾고 배열을 이러한 블록으로 옮기는데 추가적인 시간을 자주 쓰게 됩니다. 이런 경우, 배열에 필요한 최대 공간을 사전할당하여 코드 실행 시간을 개선할 수 있습니다.
다음 코드는 스칼라 변수 x
를 만든 다음 for
루프에서 x
의 크기를 점진적으로 늘리는 데 필요한 시간을 표시합니다.
tic x = 0; for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.301528 seconds.
x
에 대해 1×1,000,000 메모리 블록을 사전할당하고 이를 0으로 초기화하면, 점점 커지는 데이터 구조체에 맞게 반복적으로 메모리를 다시 할당할 필요가 없기 때문에 코드가 훨씬 더 빠르게 실행됩니다.
tic x = zeros(1,1000000); for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.011938 seconds.
다음과 같이, 초기화할 배열의 종류에 적합한 사전할당 함수를 사용하십시오.
숫자형 배열의 경우
zeros
string형 배열의 경우
strings
셀형 배열의 경우
cell
table형 배열의 경우
table
비double형 행렬 사전할당하기
double
형이 아닌 다른 형식의 행렬을 저장할 메모리 블록을 사전할당할 때는 아래의 방법을 사용하지 마십시오.
A = int8(zeros(100));
이 명령문은 먼저 double
형 값으로 구성된 비희소 행렬(Full Matrix)을 만든 다음 각 요소를 int8
형으로 변환하여 int8
형의 100×100 행렬을 사전할당합니다. int8
형 값으로 배열을 만들면 시간과 메모리가 절약됩니다. 예를 들면 다음과 같습니다.
A = zeros(100,'int8');
관련 예제
- 배열 형태 변경 및 재배열하기
- 셀형 배열에 사용할 메모리 사전할당(Preallocation)하기
- categorical형 배열로 데이터에 액세스하기
- 그래픽스 객체의 배열 사전할당하기
- 객체 배열 생성하기