结合使用Julia、MATLAB和Python解决工程问题
导言
现代工程师和科学家很少局限于一种编程语言。 数值计算基于MATLAB,数据分析基于Python,高性能计算基于Julia。 但是,如果你把它们结合起来,而不是选择它们呢?
Engee计算环境允许您直接在单个脚本中运行Julia、MATLAB和Python代码,在不同语言之间快速交换数据。 在这个例子中,我们将展示它是如何工作的:在Julia中创建一个矩阵,在MATLAB中处理它,将它保存到a。mat文件,然后使用NumPy—all分析结果,而不会超出一个环境。
加入图书馆
在这个例子中,我们将需要以下库:
MATLAB-直接从Julia运行MATLAB命令和函数,允许您在环境之间共享变量MAT-用于读取和写入文件。mat作为离线数据转换器工作,而无需运行MATLAB本身。PyCall-对于来自Julia的Python脚本和库,具有语言之间的自动类型转换。
using MATLAB, MAT, PyCall
从Julia调用MATLAB
执行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脚本 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文件
朱莉娅→垫
A = rand(100,100)
matwrite("data.mat", Dict("A" => A))
然后,在MATLAB中,您可以这样做:
mat"""
load('data.mat')
"""
MATLAB→Julia
data = matread("data.mat")
A = data["A"]
从Julia调用Python
执行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
朱莉娅:
x = rand(100)
@mput x
MATLAB的:
mat"""
y = fft(x);
save('fft.mat','y')
"""
朱莉娅:
d = matread("fft.mat")
y = d["y"]
巨蟒:
np = pyimport("numpy")
py_y = PyObject(y)
meanval = np.mean(abs.(y))
在同一个Julia脚本中调用MATLAB和Python
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代码协同工作,而无需手动配置语言间桥梁。