Я генерирую граф вызовов сложной системы MATLAB и хочу знать, какие функции встроены, и помечать их.
Просто введите open, а затем имя функции в командном окне.
open function_name
И function_name
будет отображаться в редакторе, вы можете увидеть Авторское право на математическую работу внутри него, если это встроенная функция, иначе это не
Так выглядит авторское право
% Copyright 1993-2016 The MathWorks, Inc.
Является ли функция встроенной или нет, легче всего увидеть с помощью команды 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
нигде не определена.
MATLAB делает различие между «встроенными функциями» (т.е. M-файл или MEX-файл не существует, код встроен в исполняемый файл MATLAB) и другими функциями, которые являются частью пакета MATLAB, но записаны как M-файлы или MEX. -файлы.
Как Роберт показал, функция 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 (отдельный продукт) соберет все исходные M-файлы, используемые вашей функцией, и упакует их вместе в один распространяемый пакет.
Хотя я думаю, что решения на основе which
лучше, для полноты картины мы должны также рассмотреть для этого функцию exist
. Из документации:
exist name
returns the type ofname
as a number. This list describes the type associated with each value:
0 —
name
does not exist or cannot be found for other reasons. For example, ifname
exists in a restricted folder to which MATLAB® does not have access,exist
returns 0.1 —
name
is a variable in the workspace.2 —
name
is a file with extension.m
,.mlx
, or.mlapp
, or name is the name of a file with a non-registered file extension (.mat, .fig, .txt
).3 —
name
is a MEX-file on your MATLAB search path.4 —
name
is a loaded Simulink® model or a Simulink model or library file on your MATLAB search path.5 —
name
is a built-in MATLAB function. This does not include classes.6 —
name
is a P-code file on your MATLAB search path.7 —
name
is a folder.8 —
name
is a class. (exist returns 0 for Java classes if you start MATLAB with the-nojvm
option.)
Итак, когда мы попробуем это на примерах, показанных ранее:
>> exist eig
ans =
5
>> exist solve
ans =
2
>> exist nosuchfunction
ans =
0
Программу/профайлер запускать не нужно - посмотрите
matlab.codetools.requiredFilesAndProducts('filename.m')
. Затем вы можете выполнить тестexist
/which
для каждого из возвращенных файлов.