MATLAB kuat di komputasi matriks dan visualisasi; Python kuat di ekosistem — pandas untuk manipulasi data, scikit-learn untuk machine learning, ribuan library khusus yang tidak pernah ditulis ulang di MATLAB. Kabar baiknya: MATLAB R2026b dapat memanggil Python secara langsung dari Command Window lewat antarmuka py.. Satu script MATLAB bisa memuat DataFrame pandas, memanggil model Python, lalu melanjutkan analisisnya dengan polyfit dan plot — dua dunia dalam satu workspace. Chapter ini membahas antarmuka tersebut beserta aturan konversi tipenya.
Memanggil Modul Python dengan Prefix py. #
Aturannya: setiap nama Python bisa diakses dari MATLAB dengan menambahkan prefix py. — modul, fungsi, dan kelas sekaligus. Mekanisme di balik layar: saat MATLAB menemukan ekspresi py.textwrap.wrap, interpreter MATLAB memuat proses Python, mengimpor modul textwrap, lalu memanggil fungsi wrap dengan argumen yang sudah dikonversi. Dua contoh resmi dari dokumentasi MathWorks:
py.list({'This','is a','list'}) % fungsi bawaan list
py.textwrap.wrap('This is a string') % fungsi di modul textwrapPemanggilan pertama membangun py.list (padanan list Python) dari cell array MATLAB; pemanggilan kedua menjalankan fungsi wrap milik modul textwrap dan mengembalikan py.list berisi baris-baris terbungkus. Modul standard library lain diakses dengan pola yang sama, misalnya py.math.sqrt(2) untuk akar kuadrat atau py.os.getcwd() untuk working directory Python. Bila modul perlu diimpor secara eksplisit (misalnya untuk memastikan versi yang dimuat), dokumentasi MATLAB memakai py.importlib.importModule('math') — padanan perintah import math di sisi Python.
Menjalankan Kode Python: pyrun dan pyenv #
Aturan eksekusi: pernyataan Python runtime dijalankan lewat pyrun, bukan dievaluasi sebagai kode MATLAB. Mekanismenya: pyrun mengirim string kode ke interpreter Python yang sudah hidup di dalam proses MATLAB; variabel yang dibuat bertahan di namespace Python untuk pemanggilan berikutnya. Sintaks resminya (sejak R2021b):
pyrun(code) % jalankan pernyataan, tanpa hasil
outvars = pyrun(code, outputs) % ambil variabel Python ke MATLAB
outvars = pyrun(code, outputs, pyName=pyValue)Contoh resmi pertama — eksekusi multi-baris dan pencetakan:
pyrun(["greeting = 'hello'", "print(greeting)"])Contoh resmi kedua — mengambil variabel Python days (sebuah list) menjadi variabel MATLAB mllist:
mllist = pyrun("days = ['Monday','Tuesday','Wednesday','Thursday','Friday']", "days")Contoh resmi ketiga — mengoper angka MATLAB sebagai input b dan c, lalu membaca hasil a:
res = pyrun("a = b*c", "a", b=5, c=10) % res = 50 (py.int)Versi Python yang dipakai diatur lewat pyenv. Pemanggilan pe = pyenv mengembalikan objek PythonEnvironment dengan properti Version, Executable, Status, dan ExecutionMode; mengganti versi dilakukan sebelum interpreter dimuat:
pe = pyenv; % tampilkan lingkungan saat ini
pe.Version % misalnya "3.10"
pyenv(Version="3.10") % atur versi default (bila Status NotLoaded)Eksekusi bisa pindah ke proses terpisah lewat pyenv(ExecutionMode="OutOfProcess") — berguna saat library Python mudah crash dan kita tidak ingin membawa-bawa proses MATLAB.
Konversi Tipe MATLAB dan Python #
Aturan konversi: kita tidak memanggil fungsi konversi secara eksplisit untuk tipe umum — antarmuka Python mengonversi otomatis di perbatasan. Mekanismenya: argumen MATLAB dikonversi ke tipe Python yang paling dekat, dan sebaliknya untuk nilai kembali. Ringkasan arah MATLAB → Python (skalar):
| Tipe MATLAB | Tipe Python | Catatan |
|---|---|---|
double / single | float | nilai pecahan |
int8 .. uint64 | int | bilangan bulat |
char / string skalar | str | teks |
logical | bool | benar/salah |
struct (skalar) | dict | kunci-nilai |
table | pandas.DataFrame | tabel data |
Untuk data array, bila NumPy tersedia maka double array menjadi numpy.array float64, cell vector menjadi tuple, dan string vector menjadi list. Arah balik Python → MATLAB:
| Tipe Python | Menjadi MATLAB | Konversi eksplisit bila perlu |
|---|---|---|
float | double (otomatis) | — |
py.int, py.float | — | double(x) |
py.str | — | char(x) atau string(x) |
py.list, py.tuple | — | cell(x), double(x) |
py.dict | dictionary / struct | struct(x) |
py.pandas.DataFrame | table (otomatis) | — |
Dua detail yang sering menjegal: py.math.sqrt(2) mengembalikan py.float yang ditampilkan MATLAB sebagai objek — konversi double(...) mengembalikannya menjadi angka MATLAB; dan hasil pyrun(..., "days") berupa py.list — cell(hasil) mengubahnya menjadi cell array sehingga bisa diindeks {1}, {2}.
Kasus Pakai: pandas dan numpy dari MATLAB #
Aturan praktis: panggil Python untuk hal yang ekosistemnya unggul, olah hasilnya di MATLAB untuk hal yang MATLAB unggul. Alur tipikalnya: py.pandas.read_csv('data.csv') memuat tabel (otomatis menjadi table), pyrun("model = ...") melatih model, double(...)/cell(...) mengonversi hasil kembali, lalu plot dan fprintf menuntaskan pelaporan. Pola yang sama bekerja untuk library internal perusahaan: modul analisis_internal di Python path dipanggil sebagai py.analisis_internal.fungsi(...) — tidak ada wrapper, tidak ada berkas antara.
Padanan Konsep yang Teruji #
Karena py.* hanya ada di MATLAB, kita menguji konsep pemetaannya dengan padanan murni MATLAB yang berjalan di Octave. Berkas contoh.m menunjukkan pemetaan yang sama dengan operasi MATLAB inti: struct menjadi pasangan kunci-nilai lewat fieldnames + struct2cell (padanan dict.items()), cell array sebagai padanan list, num2cell/cell2mat sebagai konversi bolak-balik, str2double sebagai padanan double(py.list), dan matriks dengan shape NumPy:
config = struct('nama', 'Budi', 'umur', 29, 'kota', 'Bandung');
kunci = fieldnames(config);
nilai = struct2cell(config);
fprintf('\nstruct -> padanan dict (dict.items()):\n');
for i = 1:numel(kunci)
fprintf(' %s: ', kunci{i});
v = nilai{i};
if ischar(v)
fprintf("'%s'\n", v);
else
fprintf('%d\n', v);
end
end
fprintf('padanan len(dict) = numel(fieldnames) = %d\n', numel(kunci));Output yang Dihasilkan (keseluruhan contoh.m, teruji Octave):
double 2.0 -> padanan Python float : 2.0
char Budi -> padanan Python str : Budi
cell 3 elemen -> padanan Python list: Kopi, Teh, Cokelat
padanan len(list) = numel = 3
struct -> padanan dict (dict.items()):
nama: 'Budi'
umur: 29
kota: 'Bandung'
padanan len(dict) = numel(fieldnames) = 3
num2cell + cell2mat roundtrip isequal: 1
str2double: 3.50 dan 7.25
matriks 2x3 -> padanan numpy.array shape [2 3]
RINGKASAN PEMETAAN (yang di MATLAB via py.):
double -> float | float -> double
char -> str | str -> char/string
cell -> list | py.list -> cell
struct -> dict | py.dict -> struct
matrix -> ndarray | ndarray -> double
logical -> bool | bool -> logicalSkrip tersebut tidak memanggil Python sama sekali — ia membenahi mental model kita: tipe-tipe di kedua sisi punya padanan yang terdefinisi rapi, dan konversi eksplisit (double, cell, char) hanya dibutuhkan saat otomatisasi antarmuka tidak berlaku.
Ringkasan #
Antarmuka Python MATLAB berdiri di tiga kaki: prefix py. untuk modul dan fungsi (contoh resmi py.list, py.textwrap.wrap), pyrun untuk pernyataan runtime dengan hasil dan argumen bernama (R2021b+), serta pyenv untuk mengatur versi dan mode eksekusi interpreter. Konversi tipe terjadi otomatis di perbatasan — double↔float, struct↔dict, table↔pandas.DataFrame — dengan konversi eksplisit double(), cell(), char() untuk objek py.* yang tidak dikonversi otomatis. Karena py. tidak ada di Octave, contoh teruji kita menunjukkan pemetaan konsepnya dengan padanan murni MATLAB; kode py.* ditulis sesuai dokumentasi resmi dan ditandai MATLAB-ONLY.