Gọi hàm matlab từ python

Ngày nay, khả năng viết mã đã trở thành một kỹ năng thiết yếu trong các ngành khoa học và kỹ thuật. Dù bạn thích hay không, trong quá trình học, bạn sẽ thấy mình đang làm bài tập, giải phương trình hoặc 'bài toán' lớn hơn trong dự án của mình bằng một số loại mã hóa. Và, nếu bạn nghĩ đến việc học lên cao hơn và thực hiện một số nghiên cứu sâu rộng, thì viết mã là kỹ năng cần biết đối với bạn

Thông thường, sinh viên sẽ làm quen với lập trình khoa học [lưu ý rằng tôi không đề cập cụ thể đến sinh viên CS, tập trung vào viết mã và lập trình cho mục đích chung] thông qua MATLAB. Lý do đơn giản là MATLAB đã có mặt trong lĩnh vực điện toán khoa học từ lâu và nó đã trở thành một ngôn ngữ hoặc công cụ kế thừa cho cộng đồng khoa học. Các kỹ sư và nhà khoa học luôn cần một ngôn ngữ lập trình thể hiện trực tiếp toán học ma trận và mảng, và sau đó MATLAB [phòng thí nghiệm ma trận] ra đời. MATLAB là một ngôn ngữ định hướng toán học và ma trận đi kèm với các loại hộp công cụ chuyên dụng khác nhau [bạn phải trả tiền cho hộp công cụ] cho một số mục đích e. g. lập mô hình dữ liệu kinh tế, phân tích hình ảnh hoặc điều khiển robot. Các hộp công cụ này được phát triển chuyên nghiệp, kiểm tra nghiêm ngặt và được ghi lại đầy đủ cho các ứng dụng khoa học và kỹ thuật. Và đó là lý do tại sao bạn phải trả giá cho nó

MATLAB có một số lượng lớn các chức năng và một tài liệu cực kỳ tốt để bắt đầu học và một cộng đồng khoa học rộng lớn đã trả lời các câu hỏi sắp được hỏi hoặc sẽ được ai đó trả lời khi bạn đăng chúng lên Trung tâm MATLAB. Có 365.000 người đóng góp, 120 câu hỏi được trả lời và 25.000 tập lệnh hoặc mã mẫu được tải xuống mỗi ngày. Nó có các hộp công cụ cho sinh học tính toán, tài chính tính toán, hệ thống điều khiển, khoa học dữ liệu, xử lý hình ảnh và thị giác máy tính, học máy, mô hình hóa và mô phỏng vật lý, người máy, xử lý tín hiệu và truyền thông và IOT

Mặt khác, chúng ta có Python, một ngôn ngữ lập trình trẻ hơn nhiều, có lịch sử về các gói máy tính khoa học, e. g.

eng1.exit
eng2.quit[]
3,
eng1.exit
eng2.quit[]
4, chưa bị lỗi thời. Hơn nữa, trong Python, bạn thường phải dựa vào các gói do cộng đồng tạo ra để sử dụng trong khoa học và kỹ thuật. Gọi Python là giải pháp thay thế cho MATLAB về mặt kỹ thuật là không chính xác. Đây là ngôn ngữ lập trình có mục đích chung, mà bạn có thể phát triển các ứng dụng và công cụ phần mềm chính thức cũng như để tạo các ứng dụng bằng bất kỳ thư viện GUI chính nào [e. g. Qt], sử dụng OpenGL, điều khiển cổng USB của bạn, v.v.

Là một ngôn ngữ lập trình cấp cao, đa nền tảng, đa năng và miễn phí, rất nhiều người hiện đang sử dụng Python. Các IDES như pycharm, ipython notebook, jupyter notebook và các bản phân phối như anaconda đã làm cho python trở nên hữu dụng hơn rất nhiều đối với các nhà nghiên cứu. Do sự phổ biến này, rất nhiều gói khoa học Python đã có sẵn với tài liệu mở rộng để trực quan hóa dữ liệu, học máy, xử lý ngôn ngữ tự nhiên, phân tích dữ liệu phức tạp, v.v. Ví dụ: scikit-learning bao gồm các phương pháp tiếp cận 'Machine Learning' tiên tiến nhất với tài liệu và hướng dẫn rất tốt

Đôi khi, việc lựa chọn giữa MATLAB và Python là vấn đề cá nhân hoặc có thể là do nhiệm vụ cụ thể. Những lần khác, bạn có thể buộc phải chọn Python. Cá nhân tôi, có một số vấn đề cơ bản khiến tôi phải tìm kiếm một giải pháp thay thế cho MATLAB. Tôi nghĩ vấn đề cơ bản nhất với Matlab là bản chất thương mại của nó và đây là cơ sở cho một số vấn đề

  • Các thuật toán là độc quyền, có nghĩa là bạn [hầu hết thời gian] không thể nhìn thấy mã của các thuật toán bạn đang sử dụng và phải tin tưởng rằng Matlab đã triển khai nó đúng cách
  • Rõ ràng, Matlab là tốn kém
  • Nó làm cho tính di động khó khăn hơn. Giải pháp tính di động [Thời gian chạy thành phần Matlab [MCR]] hoạt động tốt, nhưng Matlab phải hết sức cẩn thận để người ta không thể sử dụng nó để thực hiện Matlabing chung với nó. Có thể đây là lý do mà ứng dụng phải có cùng phiên bản với MCR đã cài đặt, điều này có thể gây phiền toái khi Matlab phát hành phiên bản mới cứ sau 6 tháng
  • Bản chất độc quyền cũng khiến các bên thứ 3 khó mở rộng hoặc tạo công cụ cho Matlab, nếu không muốn nói là không thể.

Tất nhiên, Matlab cũng có những ưu điểm của nó

  • Nó có một số lượng lớn các chức năng
  • Nó cũng có thể dễ sử dụng hơn cho người mới bắt đầu, vì gói bao gồm tất cả, trong khi với Python, bạn cần cài đặt các gói bổ sung và IDE
  • Nó có một cộng đồng khoa học lớn
  • Nó được sử dụng ở nhiều trường đại học [nhưng ít công ty có tiền để mua giấy phép]

Điểm cuối cùng thậm chí còn quan trọng hơn nếu bạn xem xét khả năng bạn làm việc trong lĩnh vực nghiên cứu học thuật. Không có khả năng đồng nghiệp của bạn quen sử dụng MATLAB hơn Python, hoặc mã ví dụ về các hàm được phát hành cùng với các bài báo nghiên cứu đã xuất bản sẽ được viết bằng MATLAB. Hơn nữa, MATLAB hỗ trợ viết hàm phức tạp [và tốn kém về mặt tính toán] trong các tệp nguồn C/C++, sau này được biên dịch ở định dạng nhị phân độc quyền có tên là MEX

Mẩu chuyện dài

  • bạn là một người dùng Python khó tính và được hỗ trợ nhưng thấy mình đang làm việc với các đồng nghiệp thân thiện với MATLAB;
  • bạn cần sử dụng một chức năng được gửi dưới dạng tệp MEX nhị phân đã biên dịch [có nghĩa là ngay cả khi bạn muốn, bạn không thể đọc và dịch nguồn sang Python hoặc biên dịch lại nguồn C/C++ theo cách có thể gọi nó
  • hoặc đơn giản là bạn thực sự thích cách một công cụ đã được triển khai trong MATLAB [e. g. các chức năng của Hộp công cụ thống kê hoặc Hộp công cụ tối ưu hóa, được phát triển và ghi lại rất tốt] và bạn muốn sử dụng chúng trực tiếp, thay vì tìm kiếm giải pháp thay thế Python gốc

Nếu bạn nhận ra mình thuộc một trong các loại trước đó, trong phần còn lại của bài đăng này, chúng ta sẽ xem một số chiến lược bạn có thể sử dụng để gọi các hàm MATLAB từ mã Python của bạn, theo cách mà chúng sẽ hoạt động giống như mã Python gốc

API MATLAB cho Python

Đối với MATLAB® Engine API cho Python®, bạn sẽ cần cài đặt một bản sao MATLAB trong hệ thống của mình. Theo như tôi biết thì không có cách giải quyết nào cho vấn đề này và đây là hậu quả của việc MATLAB là một phần mềm độc quyền. API này hỗ trợ hầu hết mọi phiên bản Python và yêu cầu cài đặt CPython trên hệ thống của bạn để sử dụng tham chiếu đầu vào và đầu ra cần thiết để trao đổi đối số giữa hai thế giới

Nếu bạn đáp ứng các yêu cầu này, việc cài đặt API rất đơn giản và nó được thực hiện như cách bạn làm với mọi thư viện mã nguồn Python. Trên Linux có vẻ như thế này

cd "matlabroot/extern/engines/python"
python setup.py install

trong đó matlabroot là đường dẫn mà bạn đã cài đặt MATLAB trên hệ thống của mình

Đó là nó

API cung cấp gói Python có tên

eng1.exit
eng2.quit[]
5 cho phép bạn gọi các hàm MATLAB từ Python. Bạn cài đặt gói một lần và sau đó bạn có thể gọi công cụ trong các phiên Python hiện tại hoặc tương lai của mình. Bạn có thể nhập gói mới cài đặt này bằng cách nhập gói đó vào phiên Python hiện tại của mình

import matlab.engine
eng = matlab.engine.start_matlab[]

NẾU bạn muốn tách biệt mọi thứ và bạn cần có các phiên/không gian làm việc khác nhau cho MATLAB, trong workflor của bạn, bạn có thể chỉ cần khởi động nhiều công cụ, các công cụ này sẽ không giao tiếp với nhau

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]

Để dừng một công cụ matlab, bạn có thể thoát khỏi phiên Python hiện tại của mình hoặc bắt chính công cụ đó một cách rõ ràng

eng1.exit
eng2.quit[]

Gọi các hàm MATLAB [tích hợp sẵn] từ Python

Bạn có thể gọi trực tiếp bất kỳ hàm MATLAB nào và trả kết quả về Python. Điều này duy trì miễn là hàm có thể được tìm thấy trong đường dẫn của MATLAB [chúng ta sẽ sớm quay lại vấn đề này]

Ví dụ, để xác định xem một số có phải là số nguyên tố hay không, hãy sử dụng công cụ để gọi hàm

eng1.exit
eng2.quit[]
6

tf = eng.isprime[37]
print[tf]
print[type[tf]]
True

Đây là một trong những đơn giản. hàm MATALB mà chúng tôi gọi là chỉ tạo ra một đầu ra và đó là đầu ra 'vô hướng' [thực ra là boolean], không phải là một mảng của một số loại

Khi bạn gọi một hàm với công cụ, theo mặc định, công cụ sẽ trả về một đối số đầu ra duy nhất. Nếu bạn biết rằng hàm có thể trả về nhiều đối số, bạn sẽ cần sử dụng đối số

eng1.exit
eng2.quit[]
7 để chỉ định số lượng đối số đầu ra

Ví dụ: để xác định mẫu số chung lớn nhất của hai số, hãy sử dụng hàm

eng1.exit
eng2.quit[]
8, bằng cách đặt
eng1.exit
eng2.quit[]
7 để trả về ba đối số đầu ra từ
eng1.exit
eng2.quit[]
8

eng1.exit
eng2.quit[]
4
eng1.exit
eng2.quit[]
5

Chuyển các biến từ Python sang không gian làm việc MATLAB

Khi bạn khởi động công cụ, nó sẽ cung cấp giao diện cho tập hợp tất cả các biến MATLAB. Bộ sưu tập này, được đặt tên là không gian làm việc, được triển khai dưới dạng từ điển Python được gắn vào công cụ

  • Tên của mỗi biến MATLAB trở thành một khóa trong từ điển không gian làm việc
  • Các khóa trong không gian làm việc phải là mã định danh MATLAB hợp lệ [e. g. , bạn không thể sử dụng số làm khóa]

Bạn có thể thêm các biến vào không gian làm việc của engine trong Python, sau đó bạn có thể sử dụng các biến trong các hàm MATLAB

eng1.exit
eng2.quit[]
6
eng1.exit
eng2.quit[]
7

Trong ví dụ này, x chỉ tồn tại dưới dạng biến Python. Giá trị của nó được gán cho một mục mới trong không gian làm việc của động cơ, được gọi là y, tạo một biến MATLAB. Sau đó, bạn có thể gọi hàm MATLAB

tf = eng.isprime[37]
print[tf]
print[type[tf]]
1 để thực thi câu lệnh
tf = eng.isprime[37]
print[tf]
print[type[tf]]
2 trong MATLAB và trả về giá trị đầu ra, 2. 0, sang Python

Sử dụng Mảng MATLAB trong Python

Thông thường, khi làm việc với MATLAB, chúng ta quan tâm đến việc thực hiện các thao tác phức tạp trên mảng. Gói

eng1.exit
eng2.quit[]
5 cung cấp hàm tạo để tạo mảng MATLAB trong Python. API Công cụ MATLAB cho Python có thể chuyển các mảng đó làm đối số đầu vào cho các hàm MATLAB và có thể trả về các mảng đó làm đối số đầu ra cho Python

Bạn có thể tạo các mảng của bất kỳ kiểu số hoặc logic MATLAB nào từ các kiểu chuỗi Python, như sau

import matlab.engine
eng = matlab.engine.start_matlab[]
0
import matlab.engine
eng = matlab.engine.start_matlab[]
1

Công cụ trả về b, là một mảng 1-by-5 ​​

tf = eng.isprime[37]
print[tf]
print[type[tf]]
4

Điều tương tự cũng áp dụng nếu chúng ta muốn tạo một mảng nhiều chiều. Hàm

tf = eng.isprime[37]
print[tf]
print[type[tf]]
5 trả về matlab 2-D. mảng kép sang Python

import matlab.engine
eng = matlab.engine.start_matlab[]
2
import matlab.engine
eng = matlab.engine.start_matlab[]
3

Thật không may, gói

eng1.exit
eng2.quit[]
5 dường như chỉ hoạt động với các cấu trúc dữ liệu Python thuần túy, có nghĩa là chúng ta sẽ cần sử dụng một số thủ thuật nếu muốn làm việc với, e. g. ,
tf = eng.isprime[37]
print[tf]
print[type[tf]]
7 mảng. Điều này rất quan trọng, vì thông thường nếu chúng ta cần gọi một hàm MATLAB để hoạt động trên mảng, đó là bởi vì trong Python chúng ta đang làm việc với mảng và điều này thường được thực hiện thông qua _______ 87

Hãy xem điều gì sẽ xảy ra

import matlab.engine
eng = matlab.engine.start_matlab[]
4
import matlab.engine
eng = matlab.engine.start_matlab[]
5

Chúng tôi đã tạo một mảng

tf = eng.isprime[37]
print[tf]
print[type[tf]]
7 a, sau đó chúng tôi tính bình phương của từng giá trị của nó, tạo ra một mảng
tf = eng.isprime[37]
print[tf]
print[type[tf]]
7 khác

Nếu chúng tôi cố gắng tạo lại thao tác này bằng gói

eng1.exit
eng2.quit[]
5, chúng tôi sẽ gặp lỗi ngay khi chúng tôi cố gắng truyền mảng
tf = eng.isprime[37]
print[tf]
print[type[tf]]
7 a dưới dạng matlab. mảng kép

import matlab.engine
eng = matlab.engine.start_matlab[]
6
import matlab.engine
eng = matlab.engine.start_matlab[]
7

Điều này xảy ra vì matlab. chức năng kép đang mong đợi một danh sách hoặc một bộ dữ liệu làm đầu vào và nó không thể hiểu được numpy. kiểu dữ liệu ndarray

Một cách giải quyết là quay lại định dạng danh sách

import matlab.engine
eng = matlab.engine.start_matlab[]
8
import matlab.engine
eng = matlab.engine.start_matlab[]
9

Có những vấn đề bổ sung mà chúng ta cần phải đối mặt ở đây. đầu ra được tạo bởi lệnh gọi hàm MATLAB luôn là kiểu os matlab. cá sấu. Điều này rất hữu ích nếu nó là điểm cuối của quá trình tính toán của chúng ta, nhưng nếu chúng ta cần thực hiện các thao tác khác [bằng Python] trên đầu ra của hàm MATLAB, thì định dạng này nếu ít hoặc không sử dụng đối với chúng ta

Nếu chúng ta muốn đúng, matlab. mlarray được xem gần như là một danh sách trong Python. Các hoạt động cơ bản được hỗ trợ, nhưng ngay cả các lỗi ném chuyển đổi hoặc định hình lại. Để khắc phục hạn chế này, chúng ta có thể viết lại đầu ra dưới dạng mảng có nhiều mảng *

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
0
eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
1

Điều này cũng có thể được thực hiện trong một dòng mã

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
2____51

Gọi các tập lệnh và hàm người dùng MATLAB tùy chỉnh từ Python

Cho đến giờ, chúng ta đã thấy cách chúng ta có thể sử dụng

True

3 để gọi các hàm MATLAB tích hợp để thực hiện một số phép tính trên dữ liệu và các chiến lược để chuyển dữ liệu từ phiên Python sang không gian làm việc MATLAB

Đây là điều mà chúng tôi rất quan tâm. Thông thường, chúng tôi sẽ tìm cách chạy mã MATLAB tùy chỉnh, mã này có thể thuộc các loại khác nhau

  • tập lệnh [*. m]
  • chức năng [*. m]
  • Hàm MEX [*. mexa64]

Hãy bắt đầu với một ví dụ rất cơ bản và giả sử rằng, một lần nữa chúng ta muốn tính toán sức mạnh của một mảng

Chúng ta có thể sử dụng mã MATLAB sau

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
4

Trong thư mục hiện tại của bạn, sao chép mã MATLAB này vào tệp có tên pow_script. m

Sau khi bạn lưu tệp, chúng ta có thể gọi nó từ bên trong Python như thế này

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
5
eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
6____57
eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
8

Chỉ định

True

4 là bắt buộc. Mặc dù tập lệnh in đầu ra, nhưng nó không trả về đối số đầu ra nào cho Python

Ngoài ra [và theo ý kiến ​​​​của tôi thú vị hơn], chúng ta có thể chuyển đổi tập lệnh thành hàm và gọi hàm từ công cụ

eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
9

Tất cả những cân nhắc đã thực hiện trước đó vẫn hợp lệ đối với chức năng người dùng tùy chỉnh

eng1.exit
eng2.quit[]
0
eng1.exit
eng2.quit[]
1
eng1.exit
eng2.quit[]
2

Và rõ ràng điều này cũng sẽ cho phép chúng ta sử dụng hàm MEX phức tạp trong Python, chuyển các mảng Python làm đầu vào và nhận đầu ra trực tiếp dưới dạng các biến Python [hoặc mảng

tf = eng.isprime[37]
print[tf]
print[type[tf]]
7]

Tôi có thể gọi hàm MATLAB từ Python không?

Có hai cách để gọi mã MATLAB từ Python. Đầu tiên là sử dụng API Công cụ MATLAB cho Python, yêu cầu cài đặt MATLAB . Thứ hai là sử dụng SDK trình biên dịch MATLAB để biên dịch gói Python không yêu cầu người dùng phải cài đặt MATLAB.

Làm cách nào để chạy MATLAB bằng Python?

Khởi động Công cụ MATLAB cho Python .
Khởi động Python® tại dấu nhắc của hệ điều hành
nhập matlab. gói công cụ vào phiên Python của bạn
Bắt đầu một quy trình MATLAB® mới bằng cách gọi start_matlab. Hàm start_matlab trả về một đối tượng Python eng cho phép bạn truyền dữ liệu và gọi các hàm do MATLAB thực thi

Làm cách nào để chạy mã MATLAB bằng Python mà không cần MATLAB?

Tóm lại. bạn không thể . Bạn cần có bản cài đặt MATLAB được cấp phép, đang hoạt động, bản cài đặt này sẽ được gọi ở chế độ nền. Nếu không có bản cài đặt MATLAB hoạt động, được cấp phép, bạn không thể chạy mã MATLAB.

Tôi có thể chạy mã MATLAB trong Pycharm không?

Hiển thị hoạt động trên bài đăng này. Tôi đã chạy thành công mã MATLAB trên Pycharm, hãy để chính. py là tệp python chính của bạn bắt đầu dự án python. bạn cần đặt các tệp matlab được gọi vào cùng một thư mục '. /' của chính. py khởi động chương trình và bên trong chính. py bạn cần nhập động cơ. nhập matlab .

Chủ Đề