Main Content

사전할당(Preallocation)

루프를 돌 때마다 데이터 구조의 크기를 증분식으로 늘리는 forwhile 루프는 성능과 메모리 사용에 부정적인 영향을 미칠 수 있습니다. 배열의 크기를 반복적으로 조정하면 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');

관련 예제

세부 정보