我生成了一个复杂的MATLAB系统的调用图,我想知道内置了哪些函数并对其进行标记。
答案 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