我正在迁移我的代码,需要尽可能减少使用过的工具箱数量。例如,我有一个使用多个工具箱的大型脚本文件。我可以使用
找到这些[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文件有许多本地回调函数。
答案 0 :(得分:4)
您可以使用半文档函数
getcallinfo
获取文件调用的函数名称:
g = getcallinfo('filename.m');
f = g(1).calls.fcnCalls.names;
通常,文件可能包含子函数,g
是非标量结构数组。 g(1)
指的是文件中的main函数,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 Files\MATLAB\R2016b\toolbox\matlab\datatypes\cast)
built-in (C:\Program Files\MATLAB\R2016b\toolbox\matlab\general\computer)
built-in (C:\Program Files\MATLAB\R2016b\toolbox\matlab\lang\error)
C:\Program Files\MATLAB\R2016b\toolbox\matlab\specfun\factorial.m
built-in (C:\Program Files\MATLAB\R2016b\toolbox\matlab\elmat\isequal)
built-in (C:\Program Files\MATLAB\R2016b\toolbox\matlab\elmat\length)
message is a built-in method % message constructor
built-in (C:\Program Files\MATLAB\R2016b\toolbox\matlab\elmat\numel)