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:

matlab
py.list({'This','is a','list'})          % fungsi bawaan list
py.textwrap.wrap('This is a string')     % fungsi di modul textwrap

Pemanggilan 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):

matlab
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:

matlab
pyrun(["greeting = 'hello'", "print(greeting)"])

Contoh resmi kedua — mengambil variabel Python days (sebuah list) menjadi variabel MATLAB mllist:

matlab
mllist = pyrun("days = ['Monday','Tuesday','Wednesday','Thursday','Friday']", "days")

Contoh resmi ketiga — mengoper angka MATLAB sebagai input b dan c, lalu membaca hasil a:

matlab
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:

matlab
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 MATLABTipe PythonCatatan
double / singlefloatnilai pecahan
int8 .. uint64intbilangan bulat
char / string skalarstrteks
logicalboolbenar/salah
struct (skalar)dictkunci-nilai
tablepandas.DataFrametabel 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 PythonMenjadi MATLABKonversi eksplisit bila perlu
floatdouble (otomatis)—
py.int, py.float—double(x)
py.str—char(x) atau string(x)
py.list, py.tuple—cell(x), double(x)
py.dictdictionary / structstruct(x)
py.pandas.DataFrametable (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:

matlab
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):

text
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     -> logical

Skrip 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.