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')
, указывая, что он является частью другогоr Официальная панель инструментов:
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-файлы, которые использует ваша функция, и объединит их в один распространяемый пакет.