วิธีเรียกใช้ Python Module จาก MATLAB

Kritthanit Malathong
2 min readJan 14, 2022

--

Post id: 30, Date 14/01/2022

ก่อนจะไปดูโค้ดกัน ผมบอกเอาไว้ก่อนนะครับว่า

MATLAB แค่เรียกใช้ Python เท่านั้น แต่ไม่ได้รันโค้ดของ Python

ซึ่งหมายความว่า ก่อนที่เราจะเรียกใช้ Module จาก Python ได้ เราจำเป็นต้องติดตั้ง Python ลงไปในเครื่องให้เรียบร้อยซะก่อน รวมถึงติดตั้ง Package ต่างๆ ที่ใช้ใน Python ด้วย

หมายเหตุ โค้ดโปรแกรมชุดนี้ผมทดสอบใน MATLAB เวอร์ชั่น 2021b ดังนั้นใครที่ใช้ MATLAB เวอร์ชั่นต่ำกว่านี้ โค้ดในตัวอย่างนี้อาจรันไม่ได้นะครับ เพราะ MATLAB ในเวอร์ชั่นก่อนหน้านี้ยังไม่รองรับการทำงานกับ Python

1. เขียนโค้ด Python

แน่นอนครับว่า ก่อนจะเรียกใช้ได้ เราก็ต้องมีโค้ด Python ซะก่อน (แต่ถ้าใครมีอยู่แล้วก็เรียกใช้ได้เลยนะ) เพื่อความง่ายในการทำความเข้าใจ ผมจะยกตัวอย่างด้วยโค้ดง่ายๆ ดังนี้ครับ

pySample.py

def helloPython():
return 'Hello from python'
def plusMe(A, B):
return A+B
def getPrice(Symbol):
Info = {
'EURUSD': 1.32600,
'GBPUSD': 1.37051,
'USDJPY': 114.105
}
return Info[Symbol]
def myList():
A = [1, 2, 3, 4, 5]
return A

จากนั้นให้บันทึกไฟล์นี้เอาไว้ในโฟลเดอร์เดียวกันกับโปรแกรม MATLAB ถ้าบันทึกไว้คนละโฟลเดอร์ MATLAB จะหาไม่เจอนะครับ สำคัญมาก

2. เรียกใช้งาน Python จาก MATLAB

*โค้ดต่อไปนี้คือคำสั่งที่พิมพ์ใน MATLAB

ตัวอย่างที่ 1 เรียกฟังก์ชันที่คืนค่าเป็น string และแปลงให้อยู่ในรูปแบบ char array

>> Output = py.pySample.helloPython()Output =Python str with no properties.Hello from python>> whos Output
Name Size Bytes Class Attributes
Output 1x17 8 py.str>> A = char(Output)A ='Hello from python'>> whos A
Name Size Bytes Class Attributes
A 1x17 34 char

ตัวอย่างที่ 2 เรียกใช้งานฟังก์ชันที่คืนค่าเป็นตัวเลข

>> Output = py.pySample.plusMe(3,5)Output =8>> whos Output
Name Size Bytes Class Attributes
Output 1x1 8 double

ตัวอย่างที่ 3 เรียกใช้งานฟังก์ชันที่รับ input เป็น string

>> Output = py.pySample.getPrice('EURUSD')Output =1.3260>> whos Output
Name Size Bytes Class Attributes
Output 1x1 8 double

ตัวอย่างที่ 4 เรียกใช้งานฟังก์ชันที่คือค่าเป็น List และแปลงเป็น Double Array

>> Output = py.pySample.myList()Output =Python list with no properties.[1, 2, 3, 4, 5]>> A = cellfun(@double, cell(Output))A =1     2     3     4     5>> whos A
Name Size Bytes Class Attributes
A 1x5 40 double

3. การ re-load Python

ในกรณีที่เราไปแก้ไขไฟล์ pySample.py หลังจากโหลดมาใช้งานใน MATLAB แล้ว MATLAB จะไม่รู้จักฟังก์ชันใหม่ที่เราเพิ่มเข้าไปใน pySample.py ตัวอย่างเช่น

ผมเพิ่มฟังก์ชัน myRoot เข้าไปใน pySample.py ดังนี้

import mathdef helloPython():
return 'Hello from python'
def plusMe(A, B):
return A+B
def getPrice(Symbol):
Info = {
'EURUSD': 1.32600,
'GBPUSD': 1.37051,
'USDJPY': 114.105
}
return Info[Symbol]
def myList():
A = [1, 2, 3, 4, 5]
return A
def myRoot(A):
return math.sqrt(A)

เมื่อลองเรียกใช้งานดู จะเจอ error

>> Output = py.pySample.myRoot(6)
Unable to resolve the name py.pySample.myRoot.

ซึ่งไม่ได้หมายความว่าเราเขียนโปรแกรมผิดนะครับ เพียงแค่ MATLAB มันไม่รู้จักฟังก์ชันนี้เฉยๆ

วิธีแก้ก็คือ โหลดโมดูลใหม่อีกรอบ ดังนี้ครับ

clear classes
mod = py.importlib.import_module('pySample');
py.importlib.reload(mod);
>> Output = py.pySample.myRoot(6)Output =2.4495

จะเห็นว่าตอนนี้เราสามารถเรียกใช้ฟังก์ชัน myRoot ที่เราเพิ่งเพิ่มเข้าไปได้แล้ว

สำหรับการใช้งานเบื้องต้นก็มีเพียงเท่านี้นะครับ ใครอยากอ่านรายละเอียดมากกว่านี้ เข้าไปศึกษาได้ที่นี่เลยครับ

--

--

No responses yet