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ìnhimport 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[]
6tf = 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 raVí 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[]
8eng1.exit
eng2.quit[]
4eng1.exit
eng2.quit[]
5Chuyể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[]
6eng1.exit
eng2.quit[]
7Trong 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 PythonSử 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 PythonBạ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[]
0import matlab.engine
eng = matlab.engine.start_matlab[]
1Cô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 Pythonimport matlab.engine
eng = matlab.engine.start_matlab[]
2import matlab.engine
eng = matlab.engine.start_matlab[]
3Thậ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 _______ 87Hãy xem điều gì sẽ xảy ra
import matlab.engine
eng = matlab.engine.start_matlab[]
4import matlab.engine
eng = matlab.engine.start_matlab[]
5Chú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ácNế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épimport matlab.engine
eng = matlab.engine.start_matlab[]
6import 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[]
8import matlab.engine
eng = matlab.engine.start_matlab[]
9Có 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[]
0eng1 = 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____51Gọ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[]
4Trong 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[]
5eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
6____57eng1 = matlab.engine.start_matlab[]
eng2 = matlab.engine.start_matlab[]
8Chỉ đị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 PythonNgoà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[]
9Tấ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[]
0eng1.exit
eng2.quit[]
1eng1.exit
eng2.quit[]
2Và 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]