자급자족하는 블로그

[MATLAB] 스크립트 사용법 및 Data 관리(Using Script and Managing Data) - 2 본문

MATLAB

[MATLAB] 스크립트 사용법 및 Data 관리(Using Script and Managing Data) - 2

YPSR 2018. 7. 24. 01:16

본 포스팅에서는 MATLAB의 workspace에 있는 변수들을 외부 파일로 저장하는 법, 그리고 외부 파일로부터 data를 입력받아 workspace에 저장하는 방법에 대해서 알아보도록 하겠습니다.


1. Workspace의 data를 외부 파일로 저장


Workspace의 data를 .txt, .xls, .csv 파일 등의 형태로 저장할 때에는 지난 포스팅에서 배웠던 fprintf 함수를 사용합니다.

좀 더 구체적으로 말씀드리면, 1) fopen 함수를 이용하여 data를 저장할 파일을 열고, 2) fprintf 함수를 이용하여 data를 작성, 3) 작성이 모두 끝난 뒤에는 fclose 함수로 파일을 닫는 것입니다.


1) fopen 함수로 data를 저장할 파일 열기


Data를 작성하기 전, 작성할 공간을 직접 열어줘야 합니다. 그 역할을 fopen 함수가 하는 것이죠,

fopen 함수를 이용하면 기존에 존재하는 파일을 열 수도 있고, 새로운 파일을 생성하여 열 수도 있습니다.


>> fid = fopen('file_name', 'permission');


fid는 file identifier의 준말로써, 열린 파일에 대한 정보가 fid에 스칼라 값의 형태로 assign되는 것입니다.

file_name은 string의 형태로 입력되어야 하기 때문에, 입력시 반드시 작은따옴표가 사용되어야 합니다.

현재 디렉토리에 있는 파일 중 file_name과 동일한 파일이 있으면 그 파일이 열리며, 그렇지 않으면 file_name이라는 이름을 가지는 새로운 파일이 현재 디렉토리에 새로 생성됩니다.


Permission 또한 string의 형태로 입력되어야 하며, 때문에 작은따옴표를 반드시 사용하셔야 합니다.

Permission은 파일이 어떤 형태로 열릴 것인지를 결정하는 역할을 하는데요, 그 종류는 아래와 같으며 이 중 목적에 맞는 permission을 입력하면 됩니다.


 'r'

 읽기 전용으로 open (default, data 작성 불가)

 'w'

 수정 가능하게 open, 기존의 파일 내용을 덮어씀

 'a'

 수정 가능하게 open, 기존의 파일 내용 뒤에 추가하여 작성

Table 1. Types of permission


2) fprintf 함수로 data 작성


Data를 작성하는 방법은 지난 번에 fprintf 함수로 출력을 할 때와 거의 동일합니다. 다만 한 가지 다른 점은, 파일 내에 작성을 원할 경우에는 fprintf 함수에 file identifier를 입력으로 추가해야 한다는 것입니다.


>> fprintf('text %-5.2f additional text', var1); % Command window에 text와 data를 출력

>> fprintf(fid, 'text %-5.2f additional text', var1); % fid가 가리키는 file에 text와 data를 작성


3) fclose 함수로 파일 닫기


Data 작성이 모두 끝났으면, 열린 파일을 닫아주는 것으로 file에의 data 저장은 마무리 됩니다.


>> fclose(fid);


위 절차를 예제 파일과 그 결과로 다시 한 번 확인해보도록 합시다.

(본 포스팅에서 사용된 예제들은 포스팅 하단에 첨부되어 있음)


Fig 1. Example1: Save files for tables of velocity unit conversion and force unit conversion


   

Fig 2. The results of example1


보시는 것과 같이 현재 디렉토리에 저장된 텍스트 파일이 의도한대로 저장되었음을 확인할 수 있습니다.

다른 형태의 파일로 저장하고 싶으실 경우, fopen 함수에서 함수명 입력시 .txt 대신 원하는 형태의 확장자를 입력하시면 됩니다.


텍스트 파일로 저장할 경우, 줄바꿈 escape character는 \n이 아니라 \r\n을 사용해주셔야 합니다.


fprintf 함수를 이용하면 위와 같이 깔끔하고 정돈된 파일을 생성할 수 있지만, 단순히 workspace 내부의 변수만을 빠르게 저장하고 싶을 때도 있을 것입니다. 그 때는 굳이 fprintf 함수를 이용하여 하나하나 저장하지 않고도, save 함수를 이용하면 빠르게 저장할 수 있습니다.


>> save file_name; % workspace의 모든 변수를 file_name에 저장

>> save('file_name'); % workspace의 모든 변수를 file_name에 저장

>> save file_name var1 var2; % workspace의 변수 중 var1과 var2를 file_name에 저장

>> save('file_name', 'var1', 'var2'); % workspace의 변수 중 var1과 var2를 file_name에 저장


위와 같이 사용할 수 있습니다.

이 부분은 간단하니, 스크립트 예제 대신 Command window에서 테스트 해봅시다.


Fig 3. Save variables using save command


Fig 4. Created .mat file


Fig 5. Created .txt file


보시면 짐작하실 수 있겠지만, 변수의 선언 순서와 관계 없이 이름순으로 저장됩니다.

.mat 파일은 뒤에 소개하겠지만 load 함수를 통해 변수들을 바로 workspace로 불러올 수 있는 형태의 파일입니다.

.txt 파일로 저장하기 위해서는 Fig 3에 보이듯이  -ascii를 입력해주셔야 합니다. 그렇지 않으면 data가 정상적으로 저장되지 않습니다.



2. 외부 data를 workspace로 불러오기


지금까지는 workspace의 data를 외부로 저장하는 법에 대해 배웠습니다.

이제는 외부의 data를 workspace로 가져오도록 하겠습니다.


외부의 data를 가져오는 데에는 load 함수를 사용하면 됩니다.


>> load file_name; % file_name의 모든 변수를 workspace에 불러옴

>> load('file_name'); % file_name의 모든 변수를 workspace에 불러옴

>> load file_name var1 var2; % file_name의 변수 중 var1과 var2를 workspace에 불러옴

>> load('file_name', 'var1', 'var2'); % file_name의 변수 중 var1과 var2를 workspace에 불러옴


단, 위의 주석처럼 변수를 구분지어 불러올 수 있는 경우는 불러오고자 하는 file이 .mat 형식의 파일일 때만 가능합니다.

그 외 .txt 파일과 같은 경우에는 변수를 구분지어 불러오지 못하고, 모든 data가 하나의 변수에 assign 됩니다.


주의할 점은, MATLAB의 경우 모든 변수는 array의 형태로 존재한다는 것입니다. 때문에, 불러오고자 하는 파일 내부의 data가 array의 형태로 저장되어 있지 않을 경우, 정상적인 load가 불가하니 유의하시기 바랍니다.


이 부분도 스크립트 대신 Command window에서 확인해보도록 하겠습니다.


Fig 6. Text file for load


Fig 7. The results of load command


.mat 파일의 예시는 생략하고, .txt 파일에 대한 예시를 보여드렸습니다.

var = load('file_name')의 형태로 load 함수를 이용했을 때에는 선언한 변수에 data가 저장됩니다.

한편, load file_name의 형태로 load 함수를 이용했을 때에는 확장자를 제외한 파일명을 변수명으로 가지는 변수에 값이 assign 되는군요.



외부의 data를 불러올 수 있다는 점에서 load 함수는 굉장히 유용하고 필수적이지만, 이를 이용하기 위해서는 파일명을 직접 입력해야 한다는 단점이 있습니다. 상당히 수고로운 일이죠.

그렇다면 파일명을 입력하지 않는 방법이 있을까요?


>> [file_name, path_name] = uigetfile('*.txt', 'Message');

>> load file_name;


uigetfile 함수는 현재 디렉토리를 기준으로 탐색기를 띄워, 직접 파일을 선택할 수 있도록 도와주는 함수입니다.

직접 선택한 파일의 파일명과 경로를 각각 file_name과 path_name에 저장해주는데요, 파일명을 얻은 이후에는 load 함수를 사용할 수 있으니 직접 파일명을 손으로 입력해주지 않아도 되는 것이죠.


uigetfile의 첫 번째 입력 '*.txt'이 의미하는 바는 폴더 내 파일 중 .txt 파일만 선택하겠다는 의미입니다. 때문에 이렇게 실행을 하면 탐색기에서도 .txt 파일 외에는 검색되지 않습니다. 만약 .txt 외 특정한 확장자의 파일만을 보고 싶은 경우에는 그 확장자를 대신 입력하면 되겠지요. 확장자에 관계없이 모든 파일을 탐색하고 싶을 때에는 '*.*'를 입력해주시면 됩니다.


두 번째 입력 'Message'는 탐색기에 나타나는 메시지입니다. 기능에 있어서 큰 의미는 없습니다.

Fig 6의 텍스트 파일을 uigetfile 함수를 이용하여 확인보겠습니다.


Fig 8. Use uigetfile command to get file_name


Fig 9. A browser to select a file

Fig 10. The result of load command


이렇게 uigetfile 함수를 이용한다면 다양한 외부 파일을 참조/이용하는 프로그램을 실행할 때마다 스크립트를 수정해야 할 번거로움이 없어지겠네요. 알아두시면 상당히 큰 도움이 될 것입니다.



3. Excel 파일의 data 불러오기 및 저장


.txt 파일 만큼이나 data 저장에 자주 사용되는 파일이 바로 .xls 파일입니다.

때문에 MATLAB에서는 .xls 파일을 저장 및 불러오기 위한 함수가 따로 마련되어 있습니다.


>> var_name = xlsread('file_name'); % file_name의 모든 data를 var_name에 저장

>> var_name = xlsread('file_name', 'sheet_name'); % file_name의 sheet_name의 모든 data를 var_name에 저장

>> var_name = xlsread('file_name', 'sheet_name', 'range'); % file_name, sheet_name의 range 내 data를 var_name에 저장


위는 .xls 파일 내 데이터를 불러오는 함수이며, 작성하는 함수 사용법은 아래와 같습니다.


>> xlswrite('file_name', var_name); % file_name에 var_name을 저장

>> xlswrite('file_name', var_name, 'sheet_name'); % file_name의 sheet_name에 var_name을 저장

>> xlswrite('file_name', var_name, 'sheet_name', 'range'); % file_name, sheet_name의 range에 var_name을 저장


이 함수들은 .xls 파일 전용이니, file_name에 확장자를 붙이지 않아도 됩니다.

이 부분도 예시로 확인해보도록 합시다.


Fig 11. A spreadsheet for test


Fig 12. The results of xlsread command


Sheet가 여러 개 있는 경우에 sheet 이름을 입력해주지 않으면 default로 첫번째 sheet의 데이터를 반환하는군요.

그 외에는 정해준 sheet의 데이터, 또는 정해준 sheet의 range에 해당하는 data를 정상적으로 반환하는 모습입니다.

그러면 이제 xlswrite를 사용해서 위 .xls 파일을 수정해보겠습니다.


Fig 13. Use xlswrite command to edit TestData1.xls file


Fig 14. The results of xlswrite command


보시면 기존 파일의 data와 관계없이 덮어써진 결과를 확인할 수 있습니다.

심지어 기존 파일에는 Sheet4를 선언했는데, 경고가 뜨긴 했지만 정상적인 data 작성이 이루어졌네요.

다만, xlswrite를 이용한 파일 수정 시에는 해당 파일이 반드시 닫혀있어야 합니다.



본 교재에서는 Import Wizard를 이용한 파일 또는 변수 불러오기를 추가적으로 다루고 있습니다.

하지만 저는 이를 이용하는 것이 실제로 사용될 일이 많지 않을 것이라 생각하여 본 포스팅에는 기술하지 않았습니다.

후에 시간이 된다면 추가로 포스팅하도록 하겠습니다.



오늘의 포스팅은 여기서 마무리 짓겠습니다.

다음 포스팅은 2D plot에 대해서 소개하겠습니다. 감사합니다.




DataFromText.txt

DatSave.mat

DatSave.txt

example1_180723.m

FlbtoFN.txt

TestData1.xls

VmphtoVkmh.txt




Comments