专栏
标签
Julia脚本如何调用自定义m函数
技术分享
发布于 2025-07-21 16:22:05
查看 1过去316天

问题现象

在 Julia 调用自定义的 m 函数,需要用 julia 工作区的数据,但是又要调用很长的 .m 代码?

解决方法

Julia 脚本中通过 mexCallMLang 函数调用 m 函数,具体可以参考帮助文档 “Julia 语言调用 M 函数” 一节。

场景一:m 函数多个输入,无返回
1.编写一个自定义 m 函数,m函数进行简单赋值、乘法运算、画图操作,如下:

function fft_hann_new(data,low,high,fs,tit)
 temp0 = data;
 temp1 = low*high;
 temp2 = low*fs;
 temp3 = high*fs;
 disp(tit)
 plot(1:10)
end

2.Julia 脚本中调用方式如下:
(1)方式一:

using TyMLangCore
using TyMath
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
# 将 Julia 对象转为 MxArray 类型,并添加到 input 数组中
input = TyMLangCore.MxArray[]
data = rand(5)
push!(input,TyMLangCore.to_mlang(data))
push!(input,TyMLangCore.to_mlang(20.0))
push!(input,TyMLangCore.to_mlang(20e3))
push!(input,TyMLangCore.to_mlang(6.1e6))
push!(input,TyMLangCore.to_mlang("i"))
# 使用 mexCallMLang 调用 fft_hann_new 函数,返回参数个数0,fft_hann_new 输入参数为 input 数组
TyMLangCore.mexCallMLang("fft_hann_new", 0, input)

(2)方式二:

using TyMLangCore
using TyMath
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
data = rand(5)
# 使用 mexCallMLang 调用 fft_hann_new 函数,返回参数个数0,第三个参数为 fft_hann_new 函数的输入参数
TyMLangCore.mexCallMLang("fft_hann_new", 0,[TyMLangCore.to_mlang(data),TyMLangCore.to_mlang(20.0),TyMLangCore.to_mlang(20e3),TyMLangCore.to_mlang(6.1e6),TyMLangCore.to_mlang("i")])

场景二:m 函数多个输入,多个返回值
1.编写一个自定义 m 函数,m函数进行简单赋值、乘法运算、画图操作,返回4个参数,如下:

function [temp0,temp1,temp2,temp3] = fft_hann_new(data,low,high,fs,tit)
 temp0 = data;
 temp1 = low*high;
 temp2 = low*fs;
 temp3 = high*fs;
 disp(tit)
 plot(1:10)
end

2.Julia 脚本中调用方式如下:
(1)方式一:

using TyMLangCore
using TyMath
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
# 将 Julia 对象转为 MxArray 类型,并添加到 input 数组中
input = TyMLangCore.MxArray[]
data = rand(5)
push!(input,TyMLangCore.to_mlang(data))
push!(input,TyMLangCore.to_mlang(20.0))
push!(input,TyMLangCore.to_mlang(20e3))
push!(input,TyMLangCore.to_mlang(6.1e6))
push!(input,TyMLangCore.to_mlang("i"))
# 使用 mexCallMLang 调用 fft_hann_new 函数,返回参数个数4,fft_hann_new 输入参数为 input 数组
mv = TyMLangCore.mexCallMLang("fft_hann_new", 4, input)
# 将 MxArray 类型转换对应的 Julia 类型,分别赋给 temp0 temp1 temp2 temp3
temp0,temp1,temp2,temp3 = normalize.(TyMLangCore.from_mlang.(mv))

(2)方式二:

using TyMLangCore
using TyMath
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
# 将 Julia 对象转为 MxArray 类型,并添加到 input 数组中
input = TyMLangCore.MxArray[]
data = rand(5)
push!(input,TyMLangCore.to_mlang(data))
push!(input,TyMLangCore.to_mlang(20.0))
push!(input,TyMLangCore.to_mlang(20e3))
push!(input,TyMLangCore.to_mlang(6.1e6))
push!(input,TyMLangCore.to_mlang("i"))
# 使用 mexCallMLang 调用 fft_hann_new 函数,返回参数个数4,fft_hann_new 输入参数为 input 数组
mv = TyMLangCore.mexCallMLang("fft_hann_new", 4, input)
# 将 MxArray 类型转换对应的 Julia 类型,分别赋给 temp0 temp1 temp2 temp3
temp0 = TyMLangCore.from_mlang(mv[1])
temp1 = TyMLangCore.from_mlang(mv[2])
temp2 = TyMLangCore.from_mlang(mv[3])
temp3 = TyMLangCore.from_mlang(mv[4])

注意:

1.把自定义 m 函数加到 m 搜索路径后再运行,每次修改 m 函数后需要重新把 m 函数加到路径,保证可以调用到新的自定义 m 函数
(1)可在 Julia 脚本中使用代码把 m 函数加到路径中,如下:

TyMLangCore.eval_mcode!("addpath('m函数路径')")

(2)或者可在 M 兼容终端中输入:addpath(‘m函数路径’),把 m 函数加到路径中:
image.png

2.Julia 数据类型较多 ,m 数据类型较少,该问题可能导致 Julia 调用 m 函数报错。如下:
(1)编写一个自定义 m 函数如下:

function fft_hann_new(low,high,tit)
    temp = round(low*high);
    disp(tit)
end

(2)Julia 脚本调用如下:

using TyMLangCore
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
# 将 Julia 对象转为 MxArray 类型,并添加到 input 数组中
input = TyMLangCore.MxArray[]
push!(input,TyMLangCore.to_mlang(20))
push!(input,TyMLangCore.to_mlang(6.6e6))
push!(input,TyMLangCore.to_mlang("i"))
TyMLangCore.mexCallMLang("fft_hann_new", 0, input)

(3)已确保 m 函数在路径中,调用仍报错

定位及解决方法:
(1)编写一个自定义的 save_input.m 函数,提取出 Julia 传到 M 兼容的参数数据并存为 mat 文件

function save_input(varargin)
    low = varargin{1}; 
    high = varargin{2};
    tit = varargin{3};
    save("./m.mat" )
end

(2)Julia 脚本调用 fft_hann_new.m 函数前,先调用 save_input.m 函数把 Julia 传过去的参数数据存下来

using TyMLangCore
#加载 M 函数库
TyMLangCore.load_PreloadMPackages() 
#把自定义函数 fft_hann_new 的路径添加到 M 搜索路径列表
TyMLangCore.eval_mcode!("addpath('D:/同元/case')")
# 将 Julia 对象转为 MxArray 类型,并添加到 input 数组中
input = TyMLangCore.MxArray[]
push!(input,TyMLangCore.to_mlang(20))
push!(input,TyMLangCore.to_mlang(6.6e6))
push!(input,TyMLangCore.to_mlang("i"))
# 使用 mexCallMLang 调用 save_input 函数,返回参数个数0,save_input 输入参数为 input 数组
TyMLangCore.mexCallMLang("save_input", 0, input)

(3)在 M 兼容导入上一步存的 mat 数据,用这个数据带进去测试下 m 函数是否能跑通。

(4)检查数据类型。
检查数据类型后可知报错原因:Julia 传过去的参数类型与 m 函数运行需要的不一致。
Julia 中 Int 类型数据传到 M 兼容,数据类型为 int64。字符数据传到 M 兼容,为 String 类型。
image.png
image.png

(5)解决方法:

(i)由上一步可知,Julia W中 Folat64 数据传到 M 中为 double 类型,Julia 中 Int 类型数据传到 M 兼容为 int64 类型。

修改 Julia 调用脚本,传参为 Folat64 类型后调用 m 函数可跑通

using TyMLangCore
using TyMath
input = TyMLangCore.MxArray[]
push!(input,TyMLangCore.to_mlang(float(20)))
push!(input,TyMLangCore.to_mlang(6.6e6))
push!(input,TyMLangCore.to_mlang("i"))
TyMLangCore.mexCallMLang("fft_hann_new", 0, input)

(ii)检查 Julia 传过去的参数数据及类型,类型不支持时尝试在 M 函数中手动转换数据类型
在 m 函数脚本中使用 double 函数,确保 low 变量为 double 类型后可跑通,如下

function fft_hann_new(low,high,tit)
    temp = round(double(low)*high)
    disp(tit)
end
所属专栏:Julia语言
产品信息:Syslab科学计算环境
科学计算

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天