MATLAB

MATLAB-Python 연결하는 방법 1

qlsenddl 2020. 9. 23. 16:37
728x90

 MATLAB함수를 Python에서 쓸 일이 있거나, Python에서 정의한 함수 또는 라이브러리를 MATLAB에서 쓰는 방법을 정리했다. 나는 개인적으로 Python으로 AI model을 만들고 그 결과를 MATLAB에서 가져오려고 했다. 다양하게 시도를 해봤고 그 결과를 정리해보고자 한다.

- 결론적으로 나는 3번 방식으로 겨우 성공했는데, 1, 2번 방식도 되는 상황도 있을 테니 가능하다면 1번이나 2번 방법을 사용하는 것이 좋을 것 같다.

 

1. MATLAB에서 Python 파일을 함수처럼 호출하기

 MATLAB에서 Python 함수로 호출하는 방법이다. MATLAB에서 기본적으로 Python에 내장 함수를 사용할 수 있다. 그 방법과 마찬가지 방식으로 Python 파일을 호출하는 것이다.

 

 우선 MATLAB에서 어떤 버전의 Python을 참조하는지 확인해보자.

MATLAB command 창에 pyenv라고 입력하면 어느 버전의 Python을 참조하는지 확인할 수 있다.

 단, 이게 패키지 설치 문제인지 MATLAB 버전 문제인지 모르겠지만, pyenv를 치는 경우 그러한 함수나 명령이 없다는 오류가 발생하기도 한다.

 

 MATLAB에서 Python 내장함수를 호출하는 방법은 간단하다. "py.내장함수" 형태 또는 특정 라이브러리를 import해야 하는 함수이면 "py.라이브러리 이름.함수 이름" 형태로 호출할 수 있다.

예를 들어 python의 abs 함수, math 라이브러리의 pi, python의 random 라이브러리의 randint 함수를 호출하려면 다음과 같이 하면 된다.

 

(물론 이 함수들 모두 matlab에도 이미 있는 함수이기 때문에 굳이 위에 예시로 든 함수를 쓰려고 python을 사용할 필요는 없다.)

 

 이와 비슷하게 사용자가 정의한 python 함수를 사용할 수 있다. 이 경우 우선 python 함수가 저장된 .py파일을 해당 MATLAB 코드가 있는 폴더에 넣어준다. 우선 사용자 지정 함수를 다음과 같이 정의해주었다.

 위 사진은 .py 파일을 MATLAB에서 열었을 때 화면을 보여준다. 그렇다고 .py 파일을 MATLAB에서 다룰 수 있는 것은 아니다. 나의 경우 Pycharm에서 .py 파일을 생성하고 해당 파일을 MATLAB 파일이 있는 폴더로 옮긴 것이다. 또한 MATLAB에서 .py 파일을 여는 것은 괜찮지만, 수정하게 되면 .py 파일을 실행할 때 오류가 발생한다. 그러므로 .py 파일이 MATLAB에서 열린다고 MATLAB에서 수정하면 안된다.

 

 사용자가 정의한 .py 파일의 경우 python 내장 함수처럼 "py.파일이름"으로 바로 불어올 수는 없다.(그랬다면 좋았겠지만...) 대신 다음과 같이 .py 파일과 그 내부 함수에 접근할 수 있다.

 좌측 부분이 code이고 우측 부분이 code 실행 결과이다. 나도 정확하게 코드의 작동방식을 이해한 것은 아니지만, 하나씩 설명을 하자면, 우선 "path = fileparts(which('python_module.py'))"은 python_module.py 파일이 있는 곳의 경로를 가져온다. 그러면 if 문에서 해당 경로가 기존 python의 경로에 있지 않으면 그 경로를 추가해준다.

 그 이후 "mod = py.importlib.import_module('python_module')"와 "py.importlib.reload(mod)"에서는 python_module.py을 사용할 수 있도록 가져온다. 그러면 그 이후는 python 내장 함수를 사용하는 것과 같은 방식으로 "py.(python 파일 이름).(함수 이름)"의 형식으로 함수를 호출할 수 있다. add_double함수의 경우 같은 파일의 다른 함수를 사용하는데 잘 작동하는 것으로 결과가 나타난다.

 이런 방식으로 사용자가 정의한 함수를 python에서 정의한 후 MATLAB에서 호출할 수 있다.

 

한계점

1. 사용자 정의 python 파일을 MATLAB에서 사용하는 경우, 이유를 모르겠지만 제대로 작동하지 않는 것처럼 보이는 경우가 많다. 예를 들어 .py 파일을 수정해서 파일을 새로 교체하고 실행해도 이전의 .py 파일이 호출된다는 식이다. 이런 경우 MATLAB을 아예 종료했다가 다시 실행하면 문제가 해결되는 경우도 있지만, 그것 자체만으로도 많이 번거롭다.

2. 사용자 정의 python 파일을 MATLAB에서 사용할 때, python 파일이 import하고 있는 다양한 라이브러리들도 MATLAB에서 가져온다. 사실 이 부분 때문에 결국 1번 방식을 포기하긴 했다. numpy, matplotlib.plt, copy, PIL.Image 등의 함수들은 python 파일에서 import해도 MATLAB에서 가져오는데 오류가 안나지만 torch를 import한 경우 MATLAB에서 다음과 같은 오류가 발생한다.

"

다음 사용 중 오류가 발생함: __init__ (line 373)
Python 오류: OSError: [WinError 127] 지정된 프로시저를 찾을 수 없습니다

...

"

 이 문제를 해결하려고 했지만 MATLAB과 Python을 연계하는 경우가 많지 않아서 Google에 검색해도 잘 나오지 않고, 나오더라도 아직 해결 못했다는 답변만 있었다.

 

-> 결과적으로 torch를 import하지 않는 경우, 1번 방식을 사용할 수 있겠다. 하지만 간단한 함수를 정의해서 사용하는 것은 웬만하면 MATLAB 함수에서 가능할 테니, 1번 방식으로 사용할 수 있는 경우가 있을지는 모르겠다.

728x90