Software/MATLAB

[MATLAB] .txt 파일 행렬로 읽어오기 (fopen, fscanf)

_winmin 2025. 1. 20. 11:59

 

실험 결과 logging 후 MATLAB으로 가져와 해석할 때 자주 쓰이는 방법이라 기록해두려 한다.


 

매 loop 마자 특정 데이터를 저장하고, 그것을 .txt 확장자로 저장했다고 하자.

 

"test.txt"

1 2 3 4 5 6

2 4 6 8 10 12 

3 6 9 12 15 18 

...

 

 6개의 원소를 매 loop마다 저장해 (한 행) 총 n개의 열을 저장해다.

 

이제 생성된 txt 파일을 script와 같은 경로에 두고 (같은 경로가 아니라면 fopen 함수의 경로 파라미터에 따로 지정), 아래 코드를 작성한다.

file1 = fopen('test.txt','r');
test_arr= fscanf(file1, '%f');
test_mat= reshape( test_arr , 6, [])' ; % [n x 6] 행렬

 

fopen 

지정해준 접근 권한으로 파일을 열어준다.

 

<접근권한>

'r' Read 권한
'w' Write 권한
'a' Write 권한. 파일 끝으로 새로운 데이터  append
'w+' Read & Write 권한
'a+' Read & Write 권한, 파일 끝으로 새로운 데이터 append
'A' Write 권한, 파일 끝으로 새로운 데이터 append, 자동 버퍼 flushing 해제
'W' Write 권한, 자동 버퍼 flushing 해제

 

fscanf

열려있는 파일을 주어진 포맷에 맞게 열벡터로 읽어온다.

 

자주 쓰이는 포매터 종류이다.

 

<포매터>

%d  Integer. 10진수
%u Unsigned Integer, 10진수
%f Floating point

 

reshape

fscanf 로 읽어온 데이터는 열벡터니, 원래 데이터 포멧에 맞게 행렬로 만들어준다.

 

fscanf 는 열 순서대로 읽어오니 reshape 전에는

[1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 .. ]'

이런 순서이다.

 

다시 원래 행렬과 같은 크기를 만든다고 

reshape(test_arr, [], 6) 

을 쓰면 행렬 데이터가 꼬이는 것이다.

 

reshape(test_arr, 6, []) 을 먼저 하고 transpose를 해주는 이유이다.

 

 

fclose

계산을 다 끝냈으면 fclose로 fopen으로 열었던 파일을 닫아준다. 

fclose(file1); % file id 로 특정 파일을 닫아줌
fclose('all'); % 열린 파일 전부를 닫아줌