我生成了一个复杂的 MATLAB 系统的调用图,我想知道哪些函数是内置的并标记它们。
4 回答
which
该命令最容易看出一个函数是否是内置的。对于给定的函数名称,它显示定义函数的文件的完整路径。例如,在我的机器上,我看到
>> which eig
built-in (/Applications/MATLAB_R2018b.app/toolbox/matlab/matfun/eig)
>> which solve
/Users/robert/Documents/MATLAB/cvx/lib/@cvxprob/solve.m % cvxprob method
>> which nosuchfunctionhere
'nosuchfunctionhere' not found.
告诉我这eig
是一个内置函数,并且solve
是 cvx 包的一部分,并且nosuchfunctionhere
没有在任何地方定义。
MATLAB 区分“内置函数”(即不存在 M 文件或 MEX 文件,代码内置于 MATLAB 可执行文件中)和其他作为 MATLAB 包的一部分但编写为 M 文件或 MEX 的函数-文件。
正如Robert 所展示的,该which
函数会告诉你一个函数是否是“内置的”,它会给你一个路径。
例如,eig
是一个内置函数(给出的路径是包含文档的文件):
>> p = which('eig')
p =
'built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@single/eig)'
imshow
不是内置的,而是核心 MATLAB 工具箱的一部分:
>> p=which('imshow')
p =
'/Applications/MATLAB_R2017a.app/toolbox/matlab/images/imshow.m'
imdilate
是图像处理工具箱自带的一个功能:
>> p = which('imdilate')
p =
'/Applications/MATLAB_R2017a.app/toolbox/images/images/imdilate.m'
并且prettyplot
是我自己编写的一个函数:
>> p = which('prettyplot')
p =
'/Users/cris/matlab/toolbox/cris/prettyplot.m'
区分这4种情况,首先查看返回的字符串是否以“built-in”开头,然后查看是否包含fullfile(matlabroot,'toolbox','matlab')
,表示是核心MATLAB工具箱的一部分,再查看是否包含fullfile(matlabroot,'toolbox')
,表示它是另一个官方工具箱的一部分:
function_name = 'eig';
p = which(function_name);
if startsWith(p,'built-in')
disp('built-in')
elseif contains(p,fullfile(matlabroot,'toolbox','matlab'))
disp('part of core MATLAB toolbox')
elseif contains(p,fullfile(matlabroot,'toolbox'))
disp('part of an official MATLAB toolbox')
else
disp('not an official MATLAB function')
end
但是,请注意某些功能可能会重载!如果您正在检查源代码以检查正在使用哪些函数,则需要知道传递的参数的类型。例如:
>> which -all eig
built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@single/eig) % single method
built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@double/eig) % double method
/Users/cris/newdip/target/dip/share/DIPimage/@dip_image/eig.m % dip_image method
在这里你可以看到有三个eig
函数,一个如果它的输入参数是 type single
,一个如果它是double
,一个如果它是dip_image
(自定义类)。根据输入,eig
使用的函数是内置函数或第 3 方函数。
可悲的是,在您运行代码之前,您不会知道使用的是哪一个。您可以手动检查输入变量的值,有时很清楚。但情况并非总是如此,类型可能取决于您正在检查的函数之外的数据。
因此,收集程序使用的函数列表的最佳方法是运行分析器。
另一种选择:MATLAB 编译器(一个单独的产品)将收集您的函数使用的所有源 M 文件,并将它们一起打包到一个可分发的包中。
虽然我认为基于的解决方案which
更好,但为了完整性,我们也应该考虑这个功能exist
。从文档中:
exist name
以数字形式返回类型name
。此列表描述了与每个值关联的类型:
0 —
name
不存在或因其他原因无法找到。例如,如果name
存在于 MATLAB® 无权访问的受限文件夹中,则exist
返回 0。1 —
name
是工作区中的变量。2 —
name
是扩展名为.m
、.mlx
或的文件.mlapp
,或者 name 是具有未注册文件扩展名 (.mat, .fig, .txt
) 的文件的名称。3 —
name
是 MATLAB 搜索路径上的 MEX 文件。4 —
name
是 MATLAB 搜索路径上加载的 Simulink® 模型或 Simulink 模型或库文件。5 —
name
是一个内置的 MATLAB 函数。这不包括类。6 —
name
是 MATLAB 搜索路径上的 P 代码文件。7 —
name
是一个文件夹。8 —
name
是一个类。(如果您使用该-nojvm
选项启动 MATLAB,则对于 Java 类,exist 返回 0。)
因此,当我们在前面显示的示例上尝试此操作时:
>> exist eig
ans =
5
>> exist solve
ans =
2
>> exist nosuchfunction
ans =
0
只需在命令窗口中键入 open 后跟函数名称
open function_name
并将function_name
显示在编辑器中,如果它是内置函数,您可能会在其中看到Mathwork 版权,否则不是
这就是版权的样子
% Copyright 1993-2016 The MathWorks, Inc.