오늘강의내용 (2014/01/17) 파일입출력 MATLAB에서계산한데이터를바이너리파일또는텍스트파일의형태로디스크에저장 디스크에저장된파일을 MATLAB workspace 상으로읽어오기 1
파일입출력 2
MATLAB File I/O 여러종류의함수제공 이진화된파일 (binary file) 의읽고쓰기 형식화된파일 (formatted ASCII) 의읽고쓰기 파일입출력함수 save, load 함수 MATLAB 에서사용하는데이터타입을저장및불러오기 dlmread, dlmwrite 사용자가지정한구분자 (delimiter) 형태로텍스트파일에저장 cvsread, cvswrite 컴마로구분된형태로데이터를텍스트파일에저장 xlsread, xlswrite 데이터를 Microsoft Excel 에저장하고, 읽어오기위한함수 Low Level File I/O C 에서사용하는파일입출력함수들과거의동일 3
MATLAB Programming >> save 파일명 save 파일명 workspace 상의 모든 변수를 MATLAB 저장 형식으로 파일명 의 이름을 갖는 파일에 저장 4
MATLAB Programming >> save 파일명 변수명 save 파일명 변수명 workspace 상에서 변수명 으로 지정한 변수를 MATLAB 저장 형식으로 파일명 의 파일에 저장 5
MATLAB Programming >> save 파일명 변수명 변수명 save 파일명 변수명 변수명 workspace 상에서 변수명 으로 지정된 모든 변수들을 MATLAB 저장 형식으로 파일명 의 파일에 저장 6
MATLAB Programming >> save 파일명 변수명 옵션 save 파일명 변수명 옵션 workspace 상에서 변수명 으로 지정한 변수를 옵션 에서 지정한 형식으로 파일명 의 파일에 저장 여기서는, 데이터를 8-digit ASCII 포맷 (즉, 텍스트 포맷) 으로 저장 7
MATLAB Programming >> save 파일명 변수명 옵션 M_ascii.txt 파일 더블 클릭시 8
>> save 파일명변수명옵션 여러가지옵션 -ascii 8-digit ASCII 형식으로저장 -ascii -double 16-digit ASCII 형식으로저장 -ascii -tabs tab 에의해분리된데이터를 8-digit ASCII 형식으로저장 -ascii -double -tabs tab 에의해분리된데이터를 16-digit ASCII 형식으로저장 9
MATLAB Programming >> save 파일명 변수명 옵션 아래와 같이 double 옵션을 주어 저장한 경우 >> save M_ascii.txt M -ascii -double M_ascii.txt 파일 더블 클릭시 10
MATLAB Programming >> save 파일명 변수명 옵션 아래와 같이 tabs 옵션을 주어 저장한 경우 >> save M_ascii.txt M -ascii -tabs M_ascii.txt 파일 더블 클릭시 11
save 함수 MAT 파일저장 >> save( MAT- 파일, 변수명, 변수명, ) Workspace 상에변수 M, N 이정의되어있을때, >> save( test.mat, M, N ) ASCII 형태로저장 >> save( ASCII- 파일, 변수명, 옵션, 옵션 ) Workspace 상에변수 M 이정의되어있을때, >> save( test.txt, M, -ascii, -double ) ASCII 파일로저장하는경우, 변수를여러개동시에저장할수없음 12
MATLAB Programming 복소수의 저장 복소수를 ASCII 형식의 파일에 저장하려고 하면, 경고가 뜸 복소수의 허수부는 저장되지 않음!! 13
MATLAB Programming 복소수의 저장 M_ascii.txt 파일 복소수의 허수부가 모두 사라짐!! 더블 클릭시 복소수를 ASCII 형식의 파일에 저장하려고 하면, 복소수의 허수부는 저장되지 않음!!MAT 파일 형태로 저장 하거나, 복소수는 반드시 구분자 (delimiter)를 사용한 텍스트 파일로 저장해야 함 14
Workspace 변수값간편하게저장하기 - Workspace 창에서마우스우측버튼클릭 - save 버튼선택하여모든변수들저장 - 각변수를클릭하고, 마우스우측버튼누르면해당변수만저장가능 15
MATLAB Programming >> load 파일명 load 파일명 파일명 이름을 갖는 파일로부터 데이터를 읽어와서 workspace 상의 변수에 대입함 16
MATLAB Programming >> load 파일명 load 파일명 파일명 이름을 갖는 파일로부터 데이터를 읽어와서 workspace 상의 변수에 대입함 17
MATLAB Programming >> load 파일명.mat 파일 확장자 (.mat)을 제외한 파일 이름 만으로 데이터를 읽어올 수 있음 18
>> 변수명 = load( 파일명 ) 변수명 = load( 파일명 ) 변수명은 struct() 타입으로되어, 파일에저장되어있는각 MATLAB 데이터들은 struct의원소로들어감 19
Current Folder 의파일더블클릭 myfile.mat 파일 더블클릭시 더블클릭만으로데이터를읽어올수있음 20
MATLAB Programming MAT-file의 저장된 변수명 알아오기 whos( -file, 파일명) 21
MATLAB Programming 일부 변수만 불러오기 load 파일명 변수명 파일명 파일로부터 변수명 으로 적힌 변수들만을 workspace 상으로 읽어옴 22
Quiz 문제 1. 다음은무작위로주어진 3차원공간상의점들을보간 (interpolation) 법을통해 3차원그래프를그리는코드이다. 무작위로주어진각점들의좌표값과보간하여얻어낸그래프의좌표정보를 MAT 파일로저장하라. ( 즉, x, y, z, X, Y, Z) 값을저장 23
Quiz 문제 2. 문제 1에서 3차원공간상의점들과, 그래프에대한각좌표값들을 MAT 파일에저장하였다. 저장한좌표값들을 MAT 파일로부터읽어와서아래그래프를복원하려고한다. 그래프를복원할때, 공간상의점들로부터보간법으로그리는것이아니라, MAT 파일로부터읽어온그래프의좌표값을 mesh 함수를이용하여그리자. 24
Quiz Sol. 좌표값을 MAT 파일에서읽어오기 그래프복원 좌표값을 MAT 파일에저장 25
MATLAB Programming 외부에서 생성한 데이터 읽어오기 메모장에서 데이터 작성 및 저장한 후 MATLAB에서 불러오기 26
MATLAB Programming CVS 파일 (콤마로 구분된 데이터)로 저장하기 MATLAB 에서 cvswrite 함수를 사용하여 CVS 형식으로 저장하면, 각 데이터가 콤마로 구분 27
MATLAB Programming 사용자 지정 구분자로 데이터 저장하기 dlmwrite( 파일명, 저장할 변수명, delimiter, 구분자로 사용할 문자) dlmwrite 함수에서 구분자(delimiter)를 로 주면, 각 데이터가 로 구분 28
사용자지정구분자데이터읽어오기 dlmread( 파일명, 구분자로사용한문자 ) dlmwrite 로저장한텍스트데이터 파일을 load 함수로읽어오게되면모든 데이터를정확하게읽어오지못함 29
MATLAB Programming 복소수를 텍스트 파일에 저장, 텍스트 파일로부터 읽어오기 각각의 복소수가 구분자 로 구분됨 30
Excel 데이터읽어오기 xlsread( 파일명 ) Excel 의첫번째 sheet 의모든데이터를가져옴 특정셀의데이터가비어있다면, MATLAB 은 NaN 으로처리 31
Excel 데이터읽어오기 ( 특정범위데이터읽어오기 ) xlsread( 파일명, 읽어올영역 ) Excel 의첫번째 sheet 의 B2:C4 영역의데이터를가져옴 32
Excel 데이터읽어오기 ( 특정 sheet 데이터읽어오기 ) xlsread( 파일명, 읽어올시트 ) Excel 의 sheet 3 의모든데이터를가져옴 33
MATLAB Programming MATLAB 변수를 Excel에 저장하기 xlswrite( 파일명, 저장할 변수명, Excel Sheet 이름) sheet 이름 생략하면 Sheet1에 저장됨 34
MATLAB Programming MATLAB 변수를 Excel 특정 영역에 저장하기 xlswrite( 파일명, 저장할 변수명, Excel Sheet, 영역) sheet 이름 생략하면 Sheet1에 저장됨 35
MATLAB 변수를 Excel 특정영역에저장하기 새로운데이터를기존엑셀파일에서데이터가존재하는부분에덮어씀 36
MATLAB Programming uiimport : 파일에서 데이터 가져오기 프롬프트에서 >> uiimport라고 입력 데이터를 파일에서 읽어올 지, 클립보드에서 읽어올지 선택 여기서는 dlm_test.txt 파일을 읽어옵시다. 37
uiimport : 파일에서데이터가져오기 dlm_test.txt 파일을읽어옴 2. 데이터를잘잘라주기위해 delimiter 를선택 1. 각행에있는데이터들이모두하나로붙어있음 38
uiimport : 파일에서데이터가져오기 1. 각행에있는데이터들이모두하나로붙어있음 39
uiimport : 파일에서데이터가져오기 import 할모든데이터선택후버튼클릭 40
uiimport : 클립보드에서데이터가져오기 1. 텍스트파일또는엑셀파일에서데이터선택하고, Ctrl+C 또는 복사하기 누름 20x20_magic_matrix.txt 파일을열어, 전체를선택하고 ctrl+c 하여복사 41
uiimport : 클립보드에서데이터가져오기 2. 프롬프트에서 >> uiimport 입력하고, clipboard 버튼선택 42
uiimport : 클립보드에서데이터가져오기 3. 클립보드에들어있는데이터를읽음 43
MATLAB Programming 파일 입출력을 위한 Dialog Box uigetfile : 파일을 가져오기 위한 dialog box 44
MATLAB Programming 파일 입출력을 위한 Dialog Box uiputfile : 파일을 저장하기 위한 dialog box 45
Low Level File I/O 지금까지학습한파일입출력방법은데이터의크기등이균일해야함 서로다른데이터타입, 서로다른크기의데이터가혼재되어있는 파일을읽고쓰기위해서는저수준파일입출력함수들을이용해야함 파일열기 fid = fopen( 파일명, 모드 ) fid는파일식별자 (file identifier) 파일닫기 st = fclose( fid ) 파일닫기성공시 0 리턴 파일닫기실패시 1 리턴 모드 r 모드에따른파일입출력작동 읽기전용으로파일을연다 r+ 읽기, 쓰기겸용으로파일을연다. w w+ a a+ 주어진파일명을갖는새로운파일을만든다. 주어진파일명과동일한파일이있으면, 파일을지우고새롭게파일을만든다. 만들어진파일을쓰기위해서연다. 주어진파일명을갖는새로운파일을만든다. 주어진파일명과동일한파일이있으면, 지우고새롭게파일을만든다. 만들어진파일을읽고쓰기위해서연다. 새로운파일을만들고연다. 같은이름의파일이존재하면쓰기위해서파일을연다. 데이터를쓰면, 그데이터는파일의끝에덧붙는다. 새로운파일을만들고연다. 같은이름의파일이존재하면읽고, 쓰기위해서파일을연다. 데이터를쓰면, 그데이터는파일의끝에덧붙는다. 46
MATLAB Programming Low Level File I/O fprintf 함수 count = fprintf( fid, format, A, ) 파일 식별자 fid를 갖는 파일에 A와 그 뒤에 입력되는 변수들의 값을 forma에 맞추어서 쓴다. 쓰여진 데이터의 bytes 수를 count 변수에 반환한다. fid 생략하면 화면에 출력 생성된 fprintf_test.txt 파일 47
Low Level File I/O fprintf 함수 format 의의미 Conversion Specifier 의미 %c 하나의문자표시 %d 십진법으로표시 %e 지수형태로표시 ( 소문자 e 이용 ) %E 지수형태로표시 ( 대문자 E 이용 ) Format의시작을의미 Flag Field width Precision Conversion Specifier %f 고정소수점으로표시 %g 중요하지않은 0 표시하지않음 %e, %f 보다간결한표현 %o 8 진법으로표시 %s 문자열로표시 %u 부호가없는십진법으로표시 %x 16 진법으로표시 ( 소문자 a-f) %X 16 진법으로표시 ( 대문자 A-F) %-12.5f Flag 의미 예 - 주어진 field의왼쪽으로정렬 %-8.2d + 부호표시 %+8.2d 0 빈공간에 0 채움 %08.2d 48
Low Level File I/O 49
MATLAB Programming Low Level File I/O fscanf 함수 : 데이터를 지정한 format에 맞게 읽어 들이는 함수 A = fscanf( fid, format, size ) 파일 식별자 fid를 갖는 파일로부터 format에 지정된 형식으로 데이터를 size 개수 만큼 읽어 들임 읽어 들인 데이터는 열 벡터의 형태로 반환하여 A 변수에 저장 읽어들이고자 하는 fscanf_test.txt 50
MATLAB Programming Low Level File I/O fscanf 함수 A = fscanf( fid, format, size ) size 가 [M N]으로 설정되면, M x N 크기를 갖는 행렬의 형태로 읽어 들임 size가 inf가 되면, 주어진 파일의 끝까지 읽어 들임 읽어들이고자 하는 fscanf_mat_test.txt 51
Quiz 아래와같이다양한형식의정보가혼합된데이터를파일로부터읽어와서, 구조체배열에저장해봅시다. measurement.txt 구조체배열 meas(1) meas(2) meas(3) time : 12:00:00 date : 01-Jan-1977 dat: [4.21 6.55 6.78 6.55; ] 52
Quiz Sol. 53
Quiz 아래그래프를그리기위해다음과같이 X, Y, Z 값을계산하면된다. >> t = 0:pi/10:2*pi; >> [X,Y,Z] = cylinder(1+cos(t).*sin(2*t)); >> surf( X, Y, Z); X, Y, Z 값은각각 21 x 21 크기의행렬로구성되어있다. X, Y, Z 행렬 ( 좌표값 ) 을 surf_plot.txt 파일에저장했다가, surf_plot.txt 파일에저장된데이터값 ( 좌표값 ) 을읽어서동일한 그래프를그려보자. 좌표저장 파일에좌표값저장 좌표복원 54
Quiz Sol. 좌표저장코드 좌표복원코드 55