где я могу использовать наборы инструментов? - PullRequest
3 голосов
/ 17 июня 2019

Я работаю над научным приложением, которое уже более 10 лет разрабатывается несколькими людьми.

Недавно мы обнаружили, что нашему приложению требуется несколько наборов инструментов, которые не являются частью стандартной установки MATLAB. Поскольку мы разрабатываем его с университетской лицензией, у нас есть доступ ко всем наборам инструментов, и поэтому мы до сих пор этого не замечали. Однако мы хотим сократить количество наборов инструментов до минимума, чтобы другим группам было проще и дешевле использовать наше программное обеспечение.

когда я бегу

[fList,pList] = matlab.codetools.requiredFilesAndProducts('myFile.m')

pList перечислите пару наборов инструментов, таких как:

 NAME                                  Version  id  Certain
'MATLAB'                                 '9.4'  1   true
'Robust Control Toolbox'               '6.4.1'  5   true
'Mapping Toolbox'                        '4.6'  11  true
'Financial Toolbox'                     '5.11'  30  true
'Aerospace Toolbox'                     '2.21'  108 true
'Parallel Computing Toolbox'            '6.12'  80  false
'MATLAB Distributed Computing Server'   '6.12'  94  false

Я уверен, что, по крайней мере, «Finacial Toolbox» и «Aerospace Toolbox» на самом деле не требуются, и мы используем их только путем копирования и вставки онлайн-решений в наше программное обеспечение, не задумываясь.

Например, мы используем функцию с именем degrees2dms, которая является частью набора инструментов и просто преобразует десятичные градусы в градусы, минуты и секунды. Это может быть легко реализовано нами без использования дополнительных наборов инструментов.

Мой вопрос теперь следующий:

Я знаю, какие наборы инструментов используются с matlab.codetools.requiredFilesAndProducts. Как я могу узнать, какие функции из этих наборов инструментов используются для замены этих функций нашим собственным кодом.

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Просмотрите вывод fList: это список ваших собственных программных файлов MATLAB, необходимых для запуска myFile.m. Просмотрите их и выполните для каждого из них команду matlab.codetools.requiredFilesAndProducts, чтобы определить, какие продукты требуются для каждого файла в базе кода. Это поможет вам определить, на каких файлах сосредоточиться.

Вы также можете попытаться запустить отчет о зависимостях для своего кода, который может предоставить более удобный интерфейс для изучения того, какие файлы используют набор инструментов.

2 голосов
/ 17 июня 2019

Это не полностью автоматический и использует полудокументированную функцию getcalliinfo, но, возможно, это может помочь.

От help getcallinfo:

GETCALLINFO  Returns called functions and their first and last lines
    This function is unsupported and might change or be removed without
    notice in a future version.

Рассмотрим пример этого функции, который использует несколько наборов инструментов и содержит локальную функцию:

function y = example(x)
a = sinc(2);
b = example_local_function(pi);
c = @xcorr;
d = c([1 2 3], [4 5 6]);
y = imdilate(x,[1 1; 1 1]);
end

function z = example_local_fun(t)
z = t.^2 + exprnd(1);
end

Сохранение этой функции в файл example.m и запуск getcallinfo дает

>> getcallinfo('example.m')
Name                 Type                 Starts Ends Length Full Name           
----                 ----                 ------ ---- ------ ---------           
example              function                1     7      7 example             
example_local_fun    subfunction             9    11      3 example>example_local_fun
ans = 
  1×2 struct array with fields:
    type
    name
    fullname
    functionPrefix
    calls
    firstline
    lastline
    linemask

В результате получается массив struct с двумя записями: первая для главной функции и вторая для локальной функции.Обратите внимание на первую запись:

>> t(1)
ans = 
  struct with fields:

              type: [1×1 internal.matlab.codetools.reports.matlabType.Function]
              name: 'example'
          fullname: 'example'
    functionPrefix: 'example>'
             calls: [1×1 struct]
         firstline: 1
          lastline: 7
          linemask: [11×1 logical]

Вызванные функции находятся в

>> t(1).calls
ans = 
  struct with fields:

      fcnCalls: [1×1 struct]
    innerCalls: [1×1 struct]
      dotCalls: [1×1 struct]
       atCalls: [1×1 struct]

В частности, в этом случае единственными двумя непустыми структурами являются

>> t(1).calls.fcnCalls
ans = 
  struct with fields:    
    names: {'sinc'  'example_local_function'  'pi'  'imdilate'}
    lines: [2 3 3 6]

>> t(1).calls.atCalls
ans = 
  struct with fields:    
    names: {'xcorr'}
    lines: 4

Чтобы увидеть, где определены вызываемые функции, вы можете применить which к каждой из ячеек в массиве ячеек, содержащихся в поле names:

C:\Program Files\MATLAB\R2018b\toolbox\signal\signal\sinc.m
'example_local_function' not found.
built-in (C:\Program Files\MATLAB\R2018b\toolbox\matlab\elmat\pi)
C:\Program Files\MATLAB\R2018b\toolbox\images\images\imdilate.m

Чтобы автоматизировать процесс, вам нужно знать имя папки панели инструментов (это легко увидеть из вашей установки Matlab).Например, для набора инструментов для обработки изображений это 'images' (или вы можете предпочесть использовать полный путь, чтобы избежать ложных срабатываний):

>> s = cellfun(@which, t(1).calls.fcnCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'images', 'once'));
>> t(1).calls.fcnCalls.names(ind)
>> t(1).calls.fcnCalls.names(ind)
ans =
  1×1 cell array
    {'imdilate'}

Процедура аналогична для других наборов инструментов.Например, папка панели инструментов обработки сигналов называется 'signals':

>> s = cellfun(@which, t(1).calls.fcnCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'signal', 'once'));
>> t(1).calls.fcnCalls.names(ind)
ans =
  1×1 cell array
    {'sinc'}

Аналогично, для других типов вызовов:

>> s = cellfun(@which, t(1).calls.atCalls.names, 'UniformOutput', false);
>> ind = ~cellfun(@isempty, regexp(s, 'signal', 'once'));
>> t(1).calls.atCalls.names(ind)
ans =
  1×1 cell array
    {'xcorr'}

Или для локальной функции:

>> s = cellfun(@which, t(2).calls.fcnCalls.names, 'UniformOutput', false)
>> ind = ~cellfun(@isempty, regexp(s, 'stats', 'once'));
>> t(2).calls.fcnCalls.names(ind)
ans =
  1×1 cell array
    {'exprnd'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...