首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断函数是内置的还是自定义的?

如何判断函数是内置的还是自定义的?
EN

Stack Overflow用户
提问于 2019-05-22 02:55:34
回答 4查看 233关注 0票数 1

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-22 06:47:19

虽然我认为基于which的解决方案更好,但是为了完整性,我们也应该考虑函数exist。从文件中:

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

  • 0- name不存在或由于其他原因找不到。例如,如果name存在于MATLAB无法访问的受限文件夹中,则exist返回0。
  • 1- name是工作区中的一个变量。
  • 2- name是扩展名为.m.mlx.mlapp的文件,或者是未注册文件扩展名(.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,则exist为Java类返回0)。

因此,当我们在earlier中展示的例子中尝试这一点时

代码语言:javascript
运行
复制
>> exist eig
ans =
     5
>> exist solve
ans =
     2
>> exist nosuchfunction
ans =
     0
票数 2
EN

Stack Overflow用户

发布于 2019-05-22 04:26:42

函数是否内置是which命令最容易看到的。对于给定的函数名,它显示定义函数的文件的完整路径。例如,在我的机器上

代码语言:javascript
运行
复制
>> 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在任何地方都没有定义。

票数 5
EN

Stack Overflow用户

发布于 2019-05-22 06:45:27

MATLAB区分了“内置函数”(即不存在M文件或MEX文件,代码被内置到MATLAB可执行文件中)和其他函数,这些函数是MATLAB包的一部分,但写成M文件或MEX文件。

作为Robert showedwhich函数将告诉您一个函数是否是“内建的”,它将为您提供一条路径。

例如,eig是一个内置函数(给定的路径是包含文档的文件):

代码语言:javascript
运行
复制
>> p = which('eig')
p =
    'built-in (/Applications/MATLAB_R2017a.app/toolbox/matlab/matfun/@single/eig)'

imshow不是内置的,而是核心MATLAB工具箱的一部分:

代码语言:javascript
运行
复制
>> p=which('imshow')
p =
    '/Applications/MATLAB_R2017a.app/toolbox/matlab/images/imshow.m'

imdilate是图像处理工具箱附带的一个函数:

代码语言:javascript
运行
复制
>> p = which('imdilate')
p =
    '/Applications/MATLAB_R2017a.app/toolbox/images/images/imdilate.m'

prettyplot是我自己写的一个函数:

代码语言:javascript
运行
复制
>> p = which('prettyplot')
p =
    '/Users/cris/matlab/toolbox/cris/prettyplot.m'

为了区分这4种情况,首先检查返回的字符串是否以“内置”开头,然后检查它是否包含fullfile(matlabroot,'toolbox','matlab'),表明它是核心MATLAB工具箱的一部分,然后检查它是否包含fullfile(matlabroot,'toolbox'),表明它是另一个官方工具箱的一部分:

代码语言:javascript
运行
复制
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

但是,请注意一些函数可能会被重载!如果您正在检查源代码以检查正在使用的函数,则需要知道传递的参数的类型。例如:

代码语言:javascript
运行
复制
>> 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,另一个是dip_image (自定义类)。根据输入,使用的函数eig是内置的或第三方的函数。

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

因此,收集程序使用的函数列表的最佳方法是运行分析器。

另一种选择: MATLAB (一个单独的产品)将收集您的函数使用的所有源文件,并将它们打包到一个可发行的包中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56248679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档