티스토리 뷰

 

규모가 작지 않은 프로젝트를 하다보면, 필히 여러 개의 m파일을 사용하게 됩니다. 용이한 관리를 위해 기능별로 함수 파일을 따로 만들기도 하고, 평소에 자주 쓰는 기능을 함수로 만들어 둔 것을 가져와서 쓰기도 합니다.

 

문제는 이 프로젝트를 배포하거나 통채로 다른 pc로 옮겨야 할 때 발생합니다. Dependency가 있는 파일들만 골라서 압축할 수 있다면 프로젝트를 배포하기 굉장히 편해질 것입니다. Program dependency를 확인하는 기능은 이미 매트랩에 있습니다.

 

kr.mathworks.com/help/matlab/matlab_prog/identify-dependencies.html

 

여기에 압축파일을 만드는 zip 함수만 이용하면, 아래와 같이 간단하게 코드를 짤 수 있습니다.

 

1
2
[fList,pList] = matlab.codetools.requiredFilesAndProducts(fnname);
zip(zipfilename, fList);
cs

 

fnname에 m파일명을 쓰면, 내부적으로 호출하는 다른 m파일 목록이 자신과 함께 fList로 반환됩니다. 여기서,

  1. m파일명은 따옴표로 묶어줘야 합니다. 안 묶으면 그 함수를 호출하는 꼴이 되니까요.
  2. 확장자는 생략 가능합니다.

 

matlab.code.....가 너무 길군요. 아래처럼 함수로 만들어두면 조금 더 쓰기 편할 것 같습니다.

 

1
2
3
4
function [fList, pList] = depfuns2zip(fnname, zipfilename)
 
[fList,pList] = matlab.codetools.requiredFilesAndProducts(fnname);
zip(zipfilename, fList);
cs

 

몇가지 알아둘 것이 있습니다.

  1. Matlab toolbox 폴더에 있는 함수들은 포함되지 않습니다. Matlab이 돌아가는 환경에서는 이미 동일 함수들이 있을 것이라는 가정이기도 하고, 설치폴더가 같다는 보장이 없으므로 포함시킬 수도 없습니다. 게다가 이것들까지 포함하면 너무 많아질테니 당연하기도 합니다. 주의할 것은, (그럴 일은 없겠지만) toolbox에 있는 사용자 정의 함수도 무시됩니다.
  2. search path 상에서 찾을 수 없는 함수도 무시됩니다. 에러는 뜨지 않습니다.
  3. 함수 핸들의 형태로 만들어둔 것은 포함됩니다.
  4. 익명함수는 무시됩니다. 파일로 존재하지 않으니까요.
  5. 로컬함수도 무시됩니다. 이미 포함된 것이나 마찬가지니까요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function randImg(n)
 
img(:,:,1= randR(n);
img(:,:,2= randG(n);
img(:,:,3= randB(n);
figure, imshow(img) % does not run when calling depfuns2zip
 
dispiter(1,10); % user-defined function - included
= peaks; % functions in toolbox - ignored
fn1 = @diamondaa; % non-existent functions - ignored (no error)
fn2 = @diamond; % handle of existing function - included
fn3 = @(x) x.^2; % anonymous functions - ignored
fn4 = @mydiamond; % local function - ignored (cause already included)
end
 
function mydiamond(N)
disp('I have %d diamonds',N)
end
cs

 

이제 프로젝트를 배포할 때 고민할 거리가 한 가지 줄었습니다. 예이~

 

- 게으른 맽랩

 

댓글