Main Content

MAT 파일에서 변수의 일부를 저장 및 불러오기

matfile 함수를 사용하여 변수의 일부를 메모리로 불러오지 않고 MAT 파일에서 직접 저장하고 불러올 수 있습니다. load 함수 또는 save 함수 대신 matfile 함수를 사용하는 방법의 주요 이점은 메모리에 담을 수 없을 정도로 매우 큰 데이터 세트의 일부를 처리할 수 있다는 것입니다. 이렇게 큰 변수를 사용할 경우, 한 번에 최대한 많은 데이터를 읽어 메모리에 기록하십시오. 그러지 않으면, 반복된 파일 액세스로 인해 코드의 성능이 저하될 수 있습니다.

matfile 함수를 사용하여 저장 및 불러오기

이 예제에서는 matfile 함수를 사용하여 기존 MAT 파일에서 변수의 일부를 불러오고 수정하고 저장하는 방법을 보여줍니다.

두 개의 변수 AB가 있는 버전 7.3 MAT 파일을 만듭니다.

A = rand(5);
B = magic(10);
save example.mat A B -v7.3;
clear A B

MAT 파일 example.mat에서 MatFile 객체를 생성합니다. matfile 함수는 MAT 파일에 대응하며 MatFile 객체의 속성을 포함하는 MatFile 객체를 생성합니다. 기본적으로, matfile은 기존 MAT 파일에서 불러오기만 허용합니다.

exampleObject = matfile('example.mat');

저장할 수 있도록 하려면 Writable 파라미터와 함께 matfile을 호출하십시오.

exampleObject = matfile('example.mat','Writable',true);

또는 별도의 단계에서 객체를 생성하고 Properties.Writable을 설정할 수도 있습니다.

exampleObject = matfile('example.mat');
exampleObject.Properties.Writable = true;

example.mat에서 B의 첫 번째 행을 변수 firstRowB로 불러온 후 데이터를 수정합니다. 버전 7.3 MAT 파일과 연결된 객체의 요소를 참조하면 MATLAB®은 사용자가 지정하는 변수의 일부만 불러옵니다.

firstRowB = exampleObject.B(1,:); 
firstRowB = 2 * firstRowB;

firstRowB에 저장된 값을 사용하여 example.mat에서 변수 B의 첫 번째 행에 있는 값을 업데이트합니다.

exampleObject.B(1,:) = firstRowB;

매우 큰 파일의 경우, 가장 좋은 접근 방식은 한 번에 최대한 많은 데이터를 읽어 메모리에 기록하는 것입니다. 그러지 않으면, 반복된 파일 액세스로 인해 코드의 성능이 저하됩니다. 예를 들어, 파일에 많은 행과 열이 있으며 하나의 행을 불러오는 데 사용 가능한 메모리의 대부분이 소요된다고 가정하겠습니다. 한 번에 요소를 하나씩 업데이트하는 대신, 각각의 행을 업데이트하십시오.

[nrowsB,ncolsB] = size(exampleObject,'B');
for row = 1:nrowsB
  exampleObject.B(row,:) = row * exampleObject.B(row,:);
end

메모리가 문제가 되지 않는다면, 변수 전체를 한 번에 업데이트할 수 있습니다.

exampleObject.B = 10 * exampleObject.B;

또는 save 함수를 -append 옵션과 함께 호출하여 변수를 업데이트합니다. -append 옵션은 save 함수가 지정된 변수 B만 바꾸고 파일 내 다른 변수는 그대로 유지하도록 요청합니다. 이 방법에서는 항상 전체 변수를 불러오고 저장해야 합니다.

load('example.mat','B');
B(1,:) = 2 * B(1,:);
save('example.mat','-append','B');

matlab.io.MatFile 객체를 사용하여 파일에 변수를 추가합니다.

exampleObject.C = magic(8);

save 함수를 -append 옵션과 함께 호출하여 변수를 추가할 수도 있습니다.

C = magic(8);
save('example.mat','-append','C');
clear C

변수의 일부를 동적으로 불러오기

이 예제에서는 MAT 파일에서 변수의 일부에 동적으로 액세스하는 방법을 보여줍니다. 이 기법은 변수 이름을 모두 알 수는 없는 MAT 파일을 사용할 때 유용합니다.

샘플 파일 topography.mat에 대응하는 MatFile 객체를 생성합니다. who 함수를 사용하여 셀형 배열 varlist에 파일의 변수 이름을 저장합니다.

exampleObject = matfile("topography.mat");
varlist = who(exampleObject)
varlist = 3x1 cell
    {'topo'    }
    {'topomap1'}
    {'topomap2'}

두 번째 변수와 세 번째 변수인 topomap1topomap2는 둘 다 컬러맵 데이터가 포함된 3열 행렬입니다. 이 두 변수 각각의 세 번째 열에 있는 컬러맵 데이터를 구조체 S의 필드로 불러옵니다. 각 필드에 대해, 원래 변수 이름 앞에 "colormap_"가 추가된 필드 이름을 지정합니다. 그런 다음 exampleObject의 속성으로 각 변수의 데이터에 액세스합니다. varName은 변수이므로 괄호로 묶습니다.

for index = 2:3
    varName = varlist{index};
    S.("colormap_"+varName) = exampleObject.(varName)(:,3);
end

구조체의 내용을 확인합니다. 구조체에는 각각 열 벡터가 포함된 두 개의 필드 colormap_topomap1colormap_topomap2가 있습니다.

S
S = struct with fields:
    colormap_topomap1: [64x1 double]
    colormap_topomap2: [128x1 double]

실수로 전체 변수를 불러오지 않도록 방지하기

MAT 파일에 있는 큰 변수의 크기를 모르는 상태에서 한 번에 이 변수의 일부만을 불러오려는 경우 end 키워드를 사용하지 마십시오. end 키워드를 사용하면 해당 변수의 전체 내용을 메모리에 일시적으로 불러오기 때문입니다. 너무 큰 변수를 불러오면 시간이 오래 걸리거나 메모리 부족(Out of Memory) 오류가 생성됩니다. 대신, MatFile 객체에 대해 size 메서드를 호출하십시오.

예를 들어, 다음 코드는 B의 전체 내용을 일시적으로 메모리에 불러옵니다.

lastColB = exampleObject.B(:,end);

성능을 높이려면 대신 다음 코드를 사용하십시오.

[nrows,ncols] = size(exampleObject,'B');
lastColB = exampleObject.B(:,ncols);

마찬가지로, exampleObject.B와 같이 matObj.varName 형식의 구문으로 변수를 참조할 때마다 MATLAB®은 전체 변수를 일시적으로 메모리로 불러옵니다. 따라서 다음과 같은 구문을 사용하여 MatFile 객체에 대해 size 메서드를 호출하도록 하십시오.

[nrows,ncols] = size(exampleObject,'B');

다음과 같이 exampleObject.B의 전체 내용을 size 함수로 전달하지 마십시오.

[nrows,ncols] = size(exampleObject.B);

구문의 차이는 미묘하지만 그 결과는 확연히 다릅니다.

부분 불러오기 및 저장을 하려면 버전 7.3 MAT 파일이 요구됨

버전 7 이하의 MAT 파일과 연결된 MatFile 객체를 사용하는 불러오기 작업이나 저장 작업을 수행하면 전체 변수를 일시적으로 메모리로 불러옵니다.

버전 7.3 형식의 파일을 생성하려면 matfile 함수를 사용하십시오. 예를 들어, 다음 코드는

newfile = matfile('newfile.mat');

부분 불러오기 및 저장을 지원하는 MAT 파일을 생성합니다.

그러나 기본적으로 save 함수는 버전 7 MAT 파일을 생성합니다. 다음과 같이 save 함수를 -v7.3 옵션과 함께 호출하여 기존의 MAT 파일을 버전 7.3으로 변환할 수 있습니다.

load('durer.mat');
save('mycopy_durer.mat','-v7.3');

새 파일을 버전 7.3 형식으로 저장하도록 기본 설정을 변경하려면 탭의 환경 섹션에 액세스하고 기본 설정을 클릭하십시오. MATLAB > 일반 > MAT 파일을 선택합니다. MATLAB Online™에서는 이 기본 설정을 사용할 수 없습니다.

참고 항목

| |

관련 항목