python이 matlab를 호출할 때의 흔한 문제 해결
왜python으로 matlab를 호출합니까?
내 자신의 일부 데이터 구조는hash 검색과 관련이 있다.python에서key는tuple 형식이고matlab에서hash 검색을 지원하는 데이터 구조는containers뿐이다.맵 (), key로 cell을 지원할 수 없습니다.
벡터를string으로 바꾸어 보았지만,num2str와str2mat의 효율이 높지 않습니다.containers.맵 () 을 찾는 데 시간이 많이 걸리기 때문에 그만둘 수밖에 없습니다.
나중에 python으로 matlab의 API를 통해 matlab의 함수를 직접 호출하여 연산에 참여할 수 있다는 것을 발견했고 친구의 경험에 의하면 매트릭스 연산은 모두 matlab에 맡겨 계산하면 매우 빠르다고 한다.
그러나 탐색 과정에서 몇 가지 문제를 발견하면 인터넷에서 거의 찾을 수 없다. 자신이 모두 탐색 발견 해결 방식에 의존하여 여기에 쓴다. 만약에 모두에게 도움을 줄 수 있다면 좋겠다.
matlab API 호출을 위한 python 구성
python 환경
여기는py2.7과Spyder의anaconda를 예로 들 수 있습니다.
mlab 라이브러리를 통해
이 가방은 홈페이지에서 직접 검색하여 다운로드하면 된다.pip를 시도해 볼 수도 있어요. 그때 어떻게 넣었는지 잊어버렸어요.
설치 후 사용 예는 다음과 같습니다.
from mlab.releases import latest_release as matlab
import os
path = os.getcwd()
mat.path(mat.path(),path) # matlab
......
모든 matlab (사용자 정의 함수 포함) 는 matlab를 통해 사용할 수 있습니다.xxxx() 방식으로 호출됩니다.mlab 패키지의 장점
matlab의 모든 변수는 매트릭스 형식이고python에 가면numpy의array 형식으로 자동으로 바뀌어 매우 편리합니다.
mlab 패키지의 단점
이게 제일 큰 버그!그것은 사용자 정의 함수가mlab를 통해python에서 호출된 후, 마치 컴파일이 읽기만 한 것처럼, 이후에 옳다는 것이다.m파일의 어떤 수정도 작용하지 않습니다.python의kernel을 다시 시작하거나spyder를 다시 시작하거나importmlab를 다시 시작하거나 삭제합니다.m 파일은 같은 이름의 함수를 재구성합니다.m파일, 다 안 돼요.삭제했습니다.m 파일,python이 오류를 보고합니다. 새 함수를 다시 명명한 후에 호출하지 않으면 이 새 함수도 수정할 수 없는 문제에 직면하게 됩니다.
컴퓨터를 다시 켜지 않으면
그래서 저는 또 다른 방식을 선택했습니다. matlab 홈페이지에서 소개하는 방식입니다.
matlab을 통해.engine
matlab 홈페이지 링크:MATLAB API for Python .
설치 프로세스:
1. matlab 설치 경로에서 "R2016b\extern\engines\python"을 찾습니다. 각각 설치 경로가 다르고 끝에 일치하는 경로를 찾으면 됩니다.
2. 여기서 구분을 주의하십시오. anaconda prompt를 통해 명령줄을 열고 다음과 같이 실행합니다. d: C>cd D:\Program Files\MATLAB\R2016b\extern\engines\python, 즉 matlab의python으로 경로를 전환하는 설정입니다.py 아래
3. 정부는 비교적 완전한 설치 방안을 제시했는데 따라 하면 된다기본값이 아닌 위치에 Python용 MATLAB 엔진 API 설치
4. 설치가 완료되면python에서 다음을 테스트할 수 있습니다.
#coding=utf-8
import matlab.engine
from numpy import *
if __name__ == '__main__':
eng = matlab.engine.start_matlab()
A = matlab.double([[1,2],[5,6]])
print(type(A),A.size,A)
print(eng.eig(A))
eng.quit()
pass
matlab.engine 패키지의 장점이것은 matlab 정부에서 소개한 방법으로 mlab의 그런 문제가 발생하지 않을 것입니다. 프로그램을 쓰면서 디버깅할 수 있습니다. 문제없습니다.
matlab.engine 패키지의 단점
사용하는 변수 중에는 많은 matlab 종류가 있는데, 그 중 일부는spyder의Variable explorer에서 표시할 수 없으며, 반드시 인위적으로 인쇄해야 합니다.
또한python 변수 유형과 matlab 변수 유형의 대응 관계를 주의해야 한다. matlab는 표: Pass Data to MATLAB from Python을 제시했다.
나는 습관적으로 변수를list 방식[1,2,3]으로 matlab의 함수에 전입한다. 이렇게 하면 matlab에서 실제적으로cell로 여겨지고 디버깅 과정에서 여러 번 만났다. 실제로 함수에만 전입하면python에서 변수를 matlab로 설정해야 한다.더블([1,2,3])이 들어와야 정상이다.
실용적인 건의
matlab.더블 형식의 변수는numpy를 통해 사용할 수 있습니다.array 방식은array 형식의 변수로 바뀌어python에서 처리하기 편리합니다.
matlab의 함수가python에 되돌아오는 값은 기본적으로 1개입니다. 함수에 매개 변수nargout=n을 추가해야 합니다. n이 되돌아오는 개수와 일치하지 않으면python은 오류를 보고합니다.
총결산
공식 소개된 matlab.엔진이 더 좋아요.
matlab는 매트릭스 계산을 처리하고,python은hash가 찾는 데이터 구조를 해결합니다.
아직 개발 초기 단계여서 데이터가python과 matlab 간의 통신 효율이 높은지 모르겠다.
처음으로 총결산을 쓰는 것은 주로 자신에게 총결산을 하기 위해 나중에 같은 오류가 발생하지 않도록 하기 위해서이다.인터넷에서 관련 문제에 대한 중국어 소개가 매우 적다는 것을 감안하여 찾을 수 있는 것은 모두 베껴서 과거의 기초 설정 문제를 베껴서 다른 친구들에게 도움을 줄 수 있도록 제가 여기에 공유합니다.
보충:python 호출 matlab 문제 해결 조언
소프트웨어 및python 비트 일치
cmd가 build와 install을 진행할 때 관리자 권한이 필요합니다.
여러 버전의 경우python,python2,python3을 사용하여python2setpy를 진행해야 합니다.py build 이렇게.
함수의 매개 변수는 일반적으로 matlab가 필요합니다.더블 변환 또는 매개 변수 값 부여 시 더블로 직접 변경
import matlab.engine
eng = matlab.engine.start_matlab()
함수나 스크립트가 현재 작업 경로에 있는지 확인해야 합니다. 즉, m 파일을python 프로그램에 넣어야 합니다.
matlab.double([44100])
matlab.double([[1.0,1.4142135623730951,1.7320508075688772,2.0,2.23606797749979]])
signal = eng.hanshu(matlab.double([44100]), matlab.double([3000]), matlab.double([5]))
기본적으로 API는 함수가 결과를 반환하는 매개변수를 1개로 간주합니다.이것은 반환 값이 없는 함수를 호출할 때 "Too many outputarguments"또는 여러 개의 반환 값만 반환하고 첫 번째 반환 값을 얻을 수 있습니다
우리는 이러한 오류를 피하기 위해 출력 매개 변수를 0개로 지정할 수 있다.
eng.hanshu(canshu, nargout=2)
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.