M兼容如何调用Julia使得运行速度加快?
技术分享
发布于 2025-07-18 11:46:44
查看 2过去319天
情况一:针对M兼容内置函数性能慢
可以调用 Julia 底层函数,以 fft 函数为例:
Fs = 1000;
T = 1/Fs;
L = 1500;
t = (0:L-1)*T;
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
X = S + 2*randn(size(t));
%M兼容
tic
Y = fft(X);
toc
%调用Julia
tic
X_ = Julia(X,"Vector{Float64}"); %参数的类型通过【Julia】函数转为Julia类型
Y_ = jcall("TyMath.fft",X_); %调用函数fft,需加上函数对应的函数库,即:TyMath.fft
Y = fromJulia(Y_); %将输出类型通过【fromJulia】函数转为适用于M兼容类型变量
toc
运行结果如下图所示,可以看出调用 Julia 可以快许多倍。

情况二:针对 M 兼容 for 循环性能慢
可以将 for 循环转为 Julia 文件,再在 M 兼容代码中调用转写的 Julia 文件。
(1).m文件示例代码:
number = 260274;
x = 64;
z = 32;
y1 = 2;
y2 = 3;
test1 = rand(1,264370);
test2 = rand(1,264370);
tic
for i = 1:number
test1(i+(0: x -1)* z) = y1;
test2(i+(0: x -1)* z) = y2;
end
toc
上述示例循环为 260274 次,测试结果运行时间为 277.917519 秒。

(2)将 for 循环改写为 .jl 文件:
function result_pam(number, x, z, y1, y2, test1, test2)
for i = 1:number
test1[i.+(0:x-1)*z] .= y1;
test2[i.+(0:x-1)*z] .= y2;
end
return test1, test2;
end
(3)然后在 M 文件中调用该函数,即:
number = 260274;
x = 64;
z = 32;
y1 = 2;
y2 = 3;
test1 = rand(1,264370);
test2 = rand(1,264370);
tic
% 所需参数的类型通过【Julia】函数转为Julia类型
number_ = Julia(number,"Int");
x_ = Julia(x,"Int");
z_ = Julia(z,"Int");
y1_ = Julia(y1,"Int");
y2_ = Julia(y2,"Int");
test1_ = Julia(test1,"Matrix{Float64}");
test2_ = Julia(test2,"Matrix{Float64}");
% 加载转写为Julia文件路径,这两行一般不做修改。注意:Julia文件需要与调用Julia的M文件放在同一文件夹
filename = fullfile(fileparts(mfilename('fullpath')),"result_pam.jl");
jcall("Main.include",Julia(filename,"String"));
jv = jcall("result_pam",number_,x_,z_,y1_,y2_,test1_,test2_); %调用改写成julia的jl文件
%将输出类型通过【fromJulia】函数转为适用于M兼容类型变量
%根据for循环可以看到输出两个变量,因此需要使用【jindex】取出,多个变量也是如此。若只输出一个变量,则与第一个例子相同方式取出。
test1 = fromJulia(jindex(jv,1));
test2 = fromJulia(jindex(jv,2));
toc
(4)重启终端,测试运行时间可以看到为 0.720266 秒。与直接用 M 兼容相比,调用 Julia 大大缩短了运行时间。

注意: For 循环中如果里面还嵌套了自己写的简单的函数,则可以在改写的 Julia 文件后面接着写嵌套的函数。
例如:改写的Julia文件中嵌套了函数【fun】,在后面跟着写该函数即可

所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境