现代工程师和科学家很少局限于一种编程语言。 数值计算基于MATLAB,数据分析基于Python,高性能计算基于Julia。 但是,如果你把它们结合起来,而不是选择它们呢?
AnyMath计算环境允许您直接在单个脚本中运行Julia、MATLAB和Python代码,在不同语言之间快速交换数据。 在这个例子中,我们将展示它是如何工作的:在Julia中创建一个矩阵,在MATLAB中处理它,将它保存到a。mat文件,然后使用NumPy—all分析结果,而不会超出一个环境。
在这个例子中,我们将需要以下库:
-直接从Julia运行MATLAB命令和函数,允许您在环境之间共享变量MATLAB -用于读取和写入文件。mat作为离线数据转换器工作,而无需运行MATLAB本身。MAT -对于来自Julia的Python脚本和库,具有语言之间的自动类型转换。PyCall
using MATLAB, MAT, PyCall
此脚本将在MATLAB内核中执行。
mat"""
a = 10;
b = 20;
c = a + b;
disp(c);
"""
有一个文件:
</no-translation>` % function1.m\ \ function y = function1(x)\ y = x.^2 + 1;\ end <no-translation>
让我们使用命令执行MATLAB脚本 mxcall()
result = mxcall(:function1, 1, 5)
println(result)
宏 @mput
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)
"""
宏 @mget
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中的模拟:
</no-translation>` y = sqrt(10); <no-translation>
通过显式会话 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中的模拟:
</no-translation>` power(10,2) <no-translation>
有一个文件:
% script1.m
x = 100;
y = x^2;
disp(y)
mat"""
run('script1.m');
"""
或
mat"""
script1
"""
朱莉娅→垫
A = rand(100,100)
matwrite("data.mat", Dict("A" => A))
然后,在MATLAB中,您可以执行以下操作:
mat"""
load('data.mat')
"""
MATLAB→Julia
data = matread("data.mat")
A = data["A"]
py"""
x = 10
y = 20
z = x + y
print(z)
"""
获得结果
result = py"z"
println(result)
有一个文件:
# mymodule.py
def square(x):
return x*x
pushfirst!(PyVector(pyimport("sys")."path"), ".")
mod = pyimport("mymodule")
result = mod.square(5)
println(result)
a = [1,2,3,4]
py"""
a = $a
"""
Python现在看到向量 x
A = rand(3,3)
py"""
A = $A
"""
PyCall自动转换数组。
py"""
import numpy as np
A = np.random.rand(3,3)
"""
A = py"A"
println(A)
np = pyimport("numpy")
x = np.linspace(0, 10, 100)
println(x)
A = rand(100)
np.mean(A)
朱莉娅:
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))
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,这是科学计算和数据分析的典型场景之一。
我们已经看到,AnyMath计算环境能够将三个语言宇宙无缝集成到一个计算过程中,这使我们能够使用不同的编程语言联合工程社区,提供一个现成的平台,使MATLAB兼容的计算、Python脚本和高性能Julia代码协同工作,而无需手动配置语言间桥梁。