2017-07-17 30 views
4

我正在迁移我的代码,并且需要尽可能减少已用工具箱的数量。例如,我有一个使用多个工具箱的大型脚本文件。我能找到这些使用从特定的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文件有许多本地回调函数。

+1

尝试运行[依赖性报告(https://uk.mathworks.com/help/matlab/matlab_prog/identify-依赖关系.html),这会告诉你哪个函数会导致一个特定的工具箱被使用。应该有一个超链接指向调用这些函数的代码的特定行。 – am304

回答

4

你可以使用的半记录功能 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 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) 
+0

谢谢路易斯,这太好了。我假设如果我通过'g'循环,我可以获得所有本地功能(子功能)。但是,这是否会将更深层次的呼叫包含在层次结构中?如果没有,是否只有这样才能实现这个目标?逐一完成每个依赖关系并做同样的事情? –

+0

@VaheTshitoyan不,它只包括第一关。在我的例子中,'factorial'例如调用'cumprod',这里不包括。您需要手动执行递归,但我不确定这是否实用 –

+2

感谢您的澄清,这开始看起来像文件交换项目 –

相关问题