반응형

http://blog.naver.com/potheymd/50149717902

매트랩 기초 2.5 - 파일 읽기와 쓰기

매트랩 기초, 매트랩, 매틀랩, 매틀랩기초, 매트랩기초, Matlab, matlab, 수치해석, 수치해석기초

매트랩을 이용해서 데이터 파일을 읽고 쓰는 작업을 자주하게 되므로, 간단하면서도 효율적인 파일 조작에 대해 배워야 한다.


Load 함수

가장 간단한 파일 읽기 방법은 load 함수를 이용하는 것이다.

현재 작업 중인 디렉터리에 올려놓은 텍스트 첨부파일을 저장한다 ('inhaUpop.txt')

현재 작업중인 폴더에 저장되어있지않을경우 매트랩은 실행되지 않는다

대게 따로 정하지 않은 이상 MATLAB 폴더가 디폴트이며 현재 작업폴더를 다음과같이 도구창에서 확인가능하다.


'inhaUpop.txt' 에는 다음과 같이 네 줄의 데이터가 동일한 형식으로 저장되어있다.

2003 17027

2004 17505

2005 17698

2006 17832

'inhaUpop.txt'는 2003년부터 2006년까지 인하대학교 학부생 수를 나타내고 있다. 첫번째 열은 년도, 두번째 열은 총 학생 수이다.

'inhaUpop.txt' 를 읽기위해 명령 프롬프트에서 load 명령을 실행한다.

>> load 'inhaUpop.txt'

명령을 실행한 뒤에 명령창에는 별다른 내용이 표시되지 않는다.

이 상태에서 who 명령을 수행하면 현재까지 생성된 변수 외에 새로이 inhaUpop가 만들어 졌음을 알 수 있다

변수 inhaUpop의 내용은 아래와 같이 확인 가능하다

>> inhaUpop


inhaUpop =


2003 17027

2004 17505

2005 17698

2006 17832

이처럼 load 명령을 사용해 읽은 데이터 파일은 파일의 확장자를 제외한 이름의 변수에 그 내용이 저장된다.

그러므로 다음과 같이 변수 이름 inhaUpop를 이용해 그래프를 그릴 수 있다.

>> plot(inhaUpop(:,1),inhaUpop(:,2),'o:')




fscanf 함수

파일을 읽는 방법으로 load보다 다양한 기능과 옵션을 가진 함수는 fscanf이다. fscanf의 사용법은 다음과 같다

  • 여기서 fid는 파일 ID의 의미로 읽은 파일에 붙여지는 ID로 해석하면 된다.
  • format은 데이터 형식을 설정해주는 부분이다. fprintf처럼 %d와 %f 등을 사용한다.
  • size는 데이터의 크기를 배열 크기처럼 [mXn]으로 정해주는 것이다.

fscanf 함수의 리턴값은 두개인데, 대부분 count없이 a만 명시한다.

결과로 저장된 데이터는 행렬 a로 리턴되고, count 는 성공적으로 읽은 데이터 개수를 말한다.


그런데, 작업 대상인 데이터 파일의 fid를 얻기 위해서는 먼저 fopen 을 사용해 파일을 열어야 한다. fopen의 일반적인 사용법은 다음과같다.


fid = fopen (Filename, Permission)

  • 여기서 Filename은 읽고자 하는 파일 이름을 의미한다
  • Permission은 읽는 파일에 대해 허용된 기능을 의미한다.

일반적으로 읽기(read)만 하고 수정 혹은 첨부하지 않을 때는 'r'을 선택한다. 가능한 permission의 옵션을 보려면 help fopen을 사용한다.


다음 명령으로 inhaUpop.txt의 fid를 부여받을 수 있다.

>> fid = fopen ('inhaUpop.txt','r')


fid =


3

만약 ()안에 명시한 파일이 존재하지 않을 때는 fid가 -1로 반환된다.

앞의 명령으로 부여받은 fid로 inhaUpop.txt를 배열 a로 저장하는 방법은 다음과 같다.

>> [a,count]=fscanf(fid,'%d%d',[2 4])


a =


2003 2004 2005 2006

17027 17505 17698 17832



count =


8

위의 명령에서 size에 해당하는 [2 4]에 주의해야한다.

fscanf명령은 열(column)-행(row) 순서로 데이터 파일을 읽기 때문에 열의 개수를 먼저 명시해야 한다.

inhaUpop.txt는 두개의 열과 네개의 행으로 되어있으므로 [2 4]로 size를 정했다.

만약 읽어들이는 데이터 파일의 열의 개수는 알지만 행의 개수가 많아서 구태여 개수를 세어 값을 정하지 않기 위해서는

행의 수에 inf를 사용한다. 즉 데이터 파일이 2개의 열로 구성되었다면 size 부분에 [2 inf]를 쓴다.


fscanf의 결과로 저장된 a 행렬은 실제 데이터 파일 형태의 전치행렬이다. 따라서 다음과 같이 a 행렬을 전치시켜 사용하는 것이 일반적인 방법이다.

전치된 행렬을 사용해 load 로 읽어 그린 그래프와 동일한 그래프를 그릴 수 있다.

>> a= a'


a =


2003 17027

2004 17505

2005 17698

2006 17832


>> plot(a(:,1),a(:,2),'o:')


예제의 경우에는 열린 파일 inhaUpop.txt를 닫을필요는 없지만 매트랩 프로그램이 복잡해질수록,

작업이 종료된 파일은 닫아주는 것이 좋다. 열린 파일을 fid를 이용해 닫는 방법은 다음과 같다

fclose(fid);

만약 여러개의 파일이 열려있는 상태라면 한 번의 명령으로 모든 파일을 닫는 것이 편ㄹ하다.

이 경우는 fclose all; 을 사용한다.


반응형

+ Recent posts