我生成一个复杂的MATLAB系统的调用图,我想知道哪些函数是内置的,并对它们进行标记。
发布于 2019-05-22 06:47:19
虽然我认为基于which
的解决方案更好,但是为了完整性,我们也应该考虑函数exist
。从文件中:
exist name
以数字形式返回name
的类型。此列表描述与每个值关联的类型:
name
不存在或由于其他原因找不到。例如,如果name
存在于MATLAB无法访问的受限文件夹中,则exist
返回0。name
是工作区中的一个变量。name
是扩展名为.m
、.mlx
或.mlapp
的文件,或者是未注册文件扩展名(.mat, .fig, .txt
)的文件名。name
是你的MATLAB搜索路径上的一个MEX文件.name
是MATLAB搜索路径上的一个加载Simulink模型或Simulink模型或库文件。name
是一个内置的MATLAB函数.这不包括类。name
是你的MATLAB搜索路径上的一个P码文件.name
是一个文件夹.name
是一个类.(如果使用-nojvm
选项启动MATLAB,则exist为Java类返回0)。因此,当我们在earlier中展示的例子中尝试这一点时
>> exist eig
ans =
5
>> exist solve
ans =
2
>> exist nosuchfunction
ans =
0
发布于 2019-05-22 04:26:42
函数是否内置是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-22 06:45:27
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
,另一个是dip_image
(自定义类)。根据输入,使用的函数eig
是内置的或第三方的函数。
可悲的是,在运行代码之前,您将不知道使用的是哪一个。您可以手动检查输入变量的值,有时很清楚。但情况并不总是如此,类型可能取决于您正在检查的函数之外的数据。
因此,收集程序使用的函数列表的最佳方法是运行分析器。
另一种选择: MATLAB (一个单独的产品)将收集您的函数使用的所有源文件,并将它们打包到一个可发行的包中。
https://stackoverflow.com/questions/56248679
复制相似问题