MATLAB

MATLAB-Python 연결하는 방법 2

qlsenddl 2020. 10. 22. 21:46
728x90

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

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


2. Python에서 MATLAB 함수 사용하기

 나의 경우 Python에서는 AI model을 MATLAB에서는 AI model의 결과를 이용해 fmincon함수로 최적화를 진행하려고 했다. 1번 방식으로 AI model을 MATLAB에서 호출할 수가 없어서 거꾸로 python에서 MATLAB의 fmincon 함수를 이용해보고자 시도했다. 결과적으로는 실패했지만, 그 방법을 공유하고자 한다.


 우선 결과적으로 Python에서 MATLAB 함수를 사용하려면 Python에 Matlab Engine API를 설치해야 한다. 자세한 내용은 아래에 나와있다.

https://kr.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

 이 내용 중에서 나는 MATLAB 명령 프롬프트에서 하는 방식과 Window 운영체제 프롬프트에서 하는 방식을 시도했는데 처음에 하면 잘 되지 않는다.

 우선 API 설치 명령은 관리자 권한이 필요하기 때문에 MATLAB 명령 프롬프트에서 하는 방식으로는 'error: could not create 'build': 액세스가 거부되었습니다'와 같은 에러 메시지가 나온다.



 Window 운영체제 프롬프트에서 하는 방식에서는 cd "matlabroot\extern\engines\python" 명령을 입력하면 '지정된 경로를 찾을 수 없습니다'라는 에러가 발생한다. 


 이를 해결하면서 설치하는 방법은 다음과 같다. 우선 MATLAB 명령창에 matlabroot라는 명령어를 입력한다. 그러면 현재 MATLAB 프로그램이 돌아가는 directory 주소가 출력된다.



 그 후 Window 명령창(cmd)를 관리자 권한으로 실행한다. matlabroot 명령으로 출력된 주소를 복사에서 Window 명령창에 'cd 복사한 주소'형태로 입력한다. 그러면 그 directory로 접근한다. 그 후 cd extern\engines\python 명령을 입력해서 해당 directory로 접근한다. 마지막으로 python setup.py install을 입력하면 MATLAB engine API가 설치된다.


Window 명령창


 나의 경우 Anaconda의 Jupyter notebook을 python 개발환경으로 사용하는데, 위와 같은 과정으로 해도 matlab engine을 사용할 수 없었다. anaconda 개발환경 사용자라면 anaconda prompt에서 위 과정(명령어)대로 설치(입력)를 하면 anaconda에서도 사용할 수 있다.


 python에서는 matlab.engine을 import하고 matlab.engine.start_matlab()이라는 객체를 생성한다. 그 후 'eng.MATLAB 함수 이름' 형태로 MATLAB 함수들을 사용할 수 있다. python에서 사용 예시는 다음과 같다. (isprime은 함수 내의 숫자가 소수인지 아닌지를 판단하는 MATLAB 함수이다.)


--- python code ---

import matlab.engine         # MATLAB engine API import

eng = matlab.engine.start_matlab()  # MATLAB engine 객체 생성

print(eng.isprime(13))

>> True

print(eng.isprime(12))

>> False


한계점

1. 가장 큰 문제는 자료형 호환이 쉽지 않다는 점이다. MATLAB에서는 숫자들을 double 형태로 다루고, MATLAB에서의 배열들도 double 자료형이다. 하지만 Python은 우선 double 자료형이 없고, double 자료형을 사용하려면 matlab.double([1, 2, 3]) 식으로 변형해서 MATLAB 함수에 입력해야 하는 경우가 많다.(https://kr.mathworks.com/help/matlab/matlab_external/use-matlab-arrays-in-python.html 참고) 하지만 이 방법 역시 여러 행이 있는 행렬을 정의할 때 MATLAB함수와 같은 방식으로 정의하면 오류가 나는 경우가 있어 제대로 사용하기 매우 복잡하다.


2. 나의 경우 fmincon MATLAB함수를 Python에서 사용하려고 했다. fmincon은 원래 .m파일로 정의된 함수를 인자로 갖는다. 하지만 이렇게 함수를 인자로 갖는 함수를 사용할 때 이 함수 인자를 어떻게 넣어야 하는지 알 수 없었다. 결국 MATLAB의 간단한 함수들만 Python에서 사용할 때만 유효하다.


3. 현재 Python 3.8이 나온 상태인데, Python 3.8은 MATLAB에서 engine API를 지원하지 않아서 사용할 수 없다. 즉, 다음과 같은 에러가 발생한다.

-> OSError: MATLAB Engine for Python supports Python version 2.7, 3.6, and 3.7, but your version of Python is 3.8

728x90