从特定的 matlab 工具箱中查找使用的函数



我正在迁移我的代码,需要尽可能减少使用的工具箱数量。例如,我有一个使用多个工具箱的大型脚本文件。我可以使用以下方法找到这些

[fList,pList] = matlab.codetools.requiredFilesAndProducts('myscript.m'); 
display({pList.Name}');

我得到以下结果

'Image Processing Toolbox'
'Instrument Control Toolbox'
'MATLAB'
'Model-Based Calibration Toolbox'
'Signal Processing Toolbox'
'Statistics and Machine Learning Toolbox'
'Parallel Computing Toolbox'

有没有一种简单的方法可以知道我的脚本文件中的特定工具箱中使用了哪些函数?例如,我如何知道我的代码中使用了'Model-Based Calibration Toolbox'的哪个函数?或者该工具箱用于哪一行代码?这样,我可以尝试自己实现该功能并避免使用工具箱。

注意:我需要它来包含所有本地和嵌套函数中的工具箱依赖项,以及这些函数中使用的函数(完整依赖项树(。例如,一个 gui 文件有许多本地回调函数。

您可以使用半文档函数获取文件调用的函数的名称getcallinfo

g = getcallinfo('filename.m');
f = g(1).calls.fcnCalls.names;

通常,该文件可能有子函数,g是一个非标量结构数组。g(1)引用文件中的主函数,f是一个单元格数组,其中包含它调用的函数的名称。f每个调用都有一个条目(g(1).calls.fcnCalls.lines发生这些调用的线路(。然后,您可以使用which找到这些功能:

cellfun(@(x) which(x), unique(f))

其中unique用于删除重复的函数名称。但请注意,which看到的功能可能与文件看到的功能不同,具体取决于搜索路径。


例如,内置文件perms.m提供:

>> g = getcallinfo('perms.m')
>> g(1)
ans = 
struct with fields:
type: [1×1 internal.matlab.codetools.reports.matlabType.Function]
name: 'perms'
fullname: 'perms'
functionPrefix: 'perms>'
calls: [1×1 struct]
firstline: 1
lastline: 37
linemask: [61×1 logical]
>> g(2)
ans = 
struct with fields:
type: 'subfunction'
name: 'permsr'
fullname: 'perms>permsr'
functionPrefix: 'perms>permsr'
calls: [1×1 struct]
firstline: 40
lastline: 61
linemask: [61×1 logical]
>> f = g(1).calls.fcnCalls.names
f =
1×8 cell array
'cast'    'computer'    'error'    'factorial'    'isequal'    'length'    'message'    'numel'
>> cellfun(@(x) which(x), unique(f))
built-in (C:Program FilesMATLABR2016btoolboxmatlabdatatypescast)
built-in (C:Program FilesMATLABR2016btoolboxmatlabgeneralcomputer)
built-in (C:Program FilesMATLABR2016btoolboxmatlablangerror)
C:Program FilesMATLABR2016btoolboxmatlabspecfunfactorial.m
built-in (C:Program FilesMATLABR2016btoolboxmatlabelmatisequal)
built-in (C:Program FilesMATLABR2016btoolboxmatlabelmatlength)
message is a built-in method  % message constructor
built-in (C:Program FilesMATLABR2016btoolboxmatlabelmatnumel)

最新更新