MATLAB에서 FOR loop를 돌리기 전, 만약 행렬의 사이즈를 미리 정의하지 않는다면 메모리 조각화 문제가 발생할 수 있음
for i=1:10
x(i)=i;
end
FOR loop가 실행되면 MATLAB은 i=1을 확인하고 운영 체제에 1 x 1 행렬을 생성하기에 충분한 메모리를 요청하고 x(1)=1을 생성. i=2인 경우 MATLAB은 1 x 2 행렬을 저장할 수 있도록 더 많은 메모리를 요청함.
이 추가 메모리가 x(1)=1일 때와 동일한 연속 메모리 스트립(strip)에 있는 경우 MATLAB은 단순히 동일한 메모리 스트립에 추가함.
원래 메모리 스트립이 1x1 행렬만 들어갈수 있고 1x2행렬은 안들어가는 경우, MATLAB은 x(1)=1 값을 1x2 행렬도 넣을만큼 충분히 큰 메모리 지점으로 옮김. 이제 행렬이 1x2이므로 원래 메모리 슬롯은 1x1보다 큰 행렬에 대해 쓸모가 없어짐. 이 메모리는 이제 단편화되어 FOR 루프에서 문제를 일으킬 수 있음.
이 문제를 해결하려면 FOR 루프에서 행렬의 최종 크기로 0의 초기 행렬을 만들어 메모리를 미리 할당해야함.
배열 또는 행렬을 미리 크기를 지정하여 생성
해당 크기를 벗어나는 인덱스에 접근하는 것은 불가능함
A = zeros(3, 3); // 3x3 크기의 0으로 채워진 배열을 사전할당하여 생성
숫자형 배열이나 문자형 배열을 변수에 대입하면 MATLAB은 연속 메모리 블록을 할당하고 이 블록에 배열 데이터를 저장
배열 데이터에 대한 정보를 헤더라는 별도의 작은 메모리 블록에 저장
tic;
for i=1:1000,
for j=1:1000,
x(i,j)=i+j;
end
end
toc
Elapsed time is 12.175349 seconds.
tic;
x=zeros(1000);
for i=1:1000,
for j=1:1000,
x(i,j)=i+j;
end
end
toc
Elapsed time is 1.761482 seconds.