如何判断一个函数是内置的还是由其名称自定义的?

时间:2019-05-22 02:55:34

标签: matlab function built-in function-declaration call-graph

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

4 个答案:

答案 0 :(得分: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则没有定义。

答案 1 :(得分:4)

MATLAB区分“内置函数”(即不存在M文件或MEX文件,代码内置在MATLAB可执行文件中)与其他函数(属于MATLAB软件包的一部分,但写为M-文件或MEX文件。

Robert showed一样,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种情况,请首先检查返回的字符串是否以“内置”开头,然后检查其是否包含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函数,如果输入参数的类型为single,则使用一个函数;如果它的double类型,则使用一个函数;如果{ {1}}(自定义类)。根据输入的不同,使用的功能dip_image是内置功能或第三方功能。

可悲的是,在运行代码之前,您将不知道使用哪一个。您可以手动检查输入变量的值,有时很清楚。但这并非总是如此,类型可能取决于您正在检查的功能之外的数据。

因此,收集程序使用的功能列表的最佳方法是运行探查器。

另一种选择:MATLAB编译器(单独的产品)将收集函数使用的所有源M文件,并将它们打包在一起成为一个可分发的包。

答案 2 :(得分:2)

尽管我认为基于npSorted = npSorted[npSorted[:, 1].astype(np.float).argsort()] # D : -0.96605562 # e : -0.28283675 # F : 0.22764316 # T : 0.27752806 # G : 0.36523876 # H : 0.50737573 # ME : 0.93213482 # B : 8 # a : 12 的解决方案更好,但出于完整性考虑,我们还应该考虑使用函数exist。从文档中:

  

which以数字形式返回exist name的类型。此列表描述了与每个值关联的类型:

     
      
  • 0-name不存在或由于其他原因找不到。例如,如果name存在于MATLAB®无法访问的受限文件夹中,则name返回0。

  •   
  • 1 — exist是工作区中的变量。

  •   
  • 2 — name是扩展名为name.m.mlx的文件,或者name是未注册文件的名称文件扩展名(.mlapp)。

  •   
  • 3 — .mat, .fig, .txt是MATLAB搜索路径上的MEX文件。

  •   
  • 4 — name是MATLAB搜索路径上已加载的Simulink®模型或Simulink模型或库文件。

  •   
  • 5 — name是内置的MATLAB函数。这不包括类。

  •   
  • 6 — name是MATLAB搜索路径上的P代码文件。

  •   
  • 7-name是一个文件夹。

  •   
  • 8 — name是一个类。 (如果您使用name选项启动MATLAB,则Java类的存在返回0。)

  •   

因此,当我们在显示于earlier的示例上进行尝试时:

-nojvm

答案 3 :(得分:1)

只需在命令窗口中输入open,然后输入函数名

uint8

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

这就是版权的外观

function_name