1

我生成了一个复杂的 MATLAB 系统的调用图,我想知道哪些函数是内置的并标记它们。

4

4 回答 4

5

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没有在任何地方定义。

于 2019-05-22T04:26:42.557 回答
4

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 文件,并将它们一起打包到一个可分发的包中。

于 2019-05-22T06:45:27.780 回答
2

虽然我认为基于的解决方案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
于 2019-05-22T06:47:19.920 回答
1

只需在命令窗口中键入 open 后跟函数名称

open function_name

并将function_name显示在编辑器中,如果它是内置函数,您可能会在其中看到Mathwork 版权,否则不是

这就是版权的样子

%   Copyright 1993-2016 The MathWorks, Inc. 
于 2019-05-22T03:49:16.917 回答