Интеграция Julia, MATLAB и Python
Совместное использование Julia, MATLAB и Python при решении инженерных задач
Введение
Современный инженер и учёный редко ограничивается одним языком программирования. Численные расчёты — на MATLAB, анализ данных — на Python, высокопроизводительные вычисления — на Julia. Но что если не выбирать, а объединить?
Вычислительная среда Engee позволяет запускать код на Julia, MATLAB и Python прямо в одном скрипте, обмениваясь данными между языками на лету. В данном примере мы покажем, как это работает: создадим матрицу в Julia, обработаем её в MATLAB, сохраним в .mat-файл, а затем проанализируем результат с помощью NumPy — и всё это без выхода за пределы одной среды.
Присоединение библиотек
В данном примере нам понадобятся следующие библиотеки:
MATLAB— для запуска MATLAB-команд и функций прямо из Julia, позволяя обмениваться переменными между средамиMAT— для чтения и записи файлов .mat без необходимости запускать сам MATLAB, работает как автономный конвертер данныхPyCall— для Python-скриптоа и библиотек из Julia с автоматической конвертацией типов между языками.
using MATLAB, MAT, PyCall
Вызов MATLAB из Julia
Выполнение MATLAB-команд
Данный скрипт выполнится внутри ядра MATLAB
mat"""
a = 10;
b = 20;
c = a + b;
disp(c);
"""
Вызов MATLAB-функции
Имеется файл:
% myfunc.m\
\
function y = myfunc(x)\
y = x.^2 + 1;\
end
Выполним скрипт MATLAB c помощью команды mxcall()и отобразим результат.
result = mxcall(:myfunc, 1, 5)
println(result)
Передача данных Julia → MATLAB
Макрос @mput помещает переменные Julia в рабочее пространство MATLAB.
x = [1,2,3,4,5]
@mput x
mat"""
y = x.^2;
disp(y)
"""
Теперь MATLAB видит переменную x.
Несколько переменных
a = 10
b = 20
@mput a b
mat"""
c = a + b;
disp(c)
"""
Получение данных MATLAB → Julia
Макрос @mget извлекает переменные MATLAB и помещает их в рабочее пространство Julia.
mat"""
x = 42;
"""
@mget x
println(x)
Получение массива
mat"""
A = magic(3);
"""
@mget A
println(A)
Одновременная передача данных
x = [1.0, 2.0, 3.0]
@mput x
mat"""
y = sin(x);
z = cos(x);
"""
@mget y z
println(y)
println(z)
Передача матриц
A = rand(5,5)
@mput A
mat"""
B = inv(A);
"""
@mget B
println(B)
Обмен данными без использования макросов
Через put_variable() и get_variable()
x = 10
put_variable(:x, x)
mat"""
y = x^2;
"""
y = get_variable(:y)
println(y)
Через интерполяцию $
x = 10
mat"""
y = $x^2;
"""
y = get_variable(:y)
println(y)
Через mxcall()
x = 10
y = mxcall(:sqrt, 1, x)
println(y)
Аналог в MATLAB:
y = sqrt(10);
Через явную сессию MSession
s = MSession()
put_variable(s, :x, 10)
eval_string(s, "y = x^2;")
y = get_mvariable(s, :y)
println(y)
close(s)
Через встроенное выражение MATLAB
y = mxcall(:power, 1, 10, 2)
println(y)
Аналог в MATLAB:
power(10,2)
Вызов MATLAB-скрипта
Имеется файл:
% script1.m
x = 100;
y = x^2;
disp(y)
mat"""
run('script1.m');
"""
или
mat"""
script1
"""
Сохранение MAT-файлов
Julia → MAT
A = rand(100,100)
matwrite("data.mat", Dict("A" => A))
Затем в MATLAB можно выполнить:
mat"""
load('data.mat')
"""
MATLAB → Julia
data = matread("data.mat")
A = data["A"]
Вызов Python из Julia
Выполнение Python-скрипта
py"""
x = 10
y = 20
z = x + y
print(z)
"""
Получение результата
result = py"z"
println(result)
Вызов Python-функции
Имеется файл:
# mymodule.py
def square(x):
return x*x
pushfirst!(PyVector(pyimport("sys")."path"), ".")
mod = pyimport("mymodule")
result = mod.square(5)
println(result)
Передача данных Julia → Python
a = [1,2,3,4]
py"""
a = $a
"""
Теперь Python видит вектор x.
Передача матрицы NumPy
A = rand(3,3)
py"""
A = $A
"""
PyCall автоматически конвертирует массив.
Получение данных Python → Julia
py"""
import numpy as np
A = np.random.rand(3,3)
"""
A = py"A"
println(A)
Использование NumPy напрямую
np = pyimport("numpy")
x = np.linspace(0, 10, 100)
println(x)
NumPy + Julia-массив
A = rand(100)
np.mean(A)
Передача данных между всеми тремя языками
Julia ↔ MATLAB ↔ Python
Julia:
x = rand(100)
@mput x
MATLAB:
mat"""
y = fft(x);
save('fft.mat','y')
"""
Julia:
d = matread("fft.mat")
y = d["y"]
Python:
np = pyimport("numpy")
py_y = PyObject(y)
meanval = np.mean(abs.(y))
Вызов MATLAB и Python в одном Julia-скрипте
x = 1:10
@mput x
mat"""
y = x.^2;
"""
@mget y
np = pyimport("numpy")
avg = np.mean(y)
println(avg)
Здесь данные проходят по цепочке: Julia → MATLAB → Julia → Python → Julia, что является одним из типичных сценариев научных вычислений и анализа данных.
Заключение
Мы убедились, что вычислительная среда Engee способна органично интегрировать три языковые вселенные в едином вычислительном процессе, что позволяет объединить инженерные сообщества, использующие разные языки программирования, предоставляя готовую платформу, где MATLAB-совместимые расчёты, скрипты на Python и высокопроизводительный код на Julia работают совместно без необходимости настраивать межъязыковые мосты вручную.