Как можно проверить наличие установленных инструментов MATLAB в скрипте / функции?

33

Как проверить наличие установленных наборов инструментов MATLAB в функции script/? (проверка версий панели инструментов также будет хорошей!) Это может обеспечить быстрое и полезное сообщение об ошибке, когда кто-то пытается запустить script без необходимого инструментария.

Быстрое, хотя и грубое решение, которое приходит на ум, - это разбор текстового вывода команды ver. Интересно, есть ли лучший способ.

Некоторые быстрые поиски показали ver product или license с аргументом 'test' может быть полезно, но я не смог найти сопоставление имен наборов инструментов (т.е. 'Image Processing Toolbox') с именами продуктов (т.е. 'control') или именами функций (т.е. image_toolbox).

Кроме того, когда я запустил license('inuse'), я получил только следующее:

>> a = license('inuse'); a

a = 

    feature: 'matlab'
       user: <username>

Я надеялся на список многих наборов инструментов, к которым у меня есть доступ.

Этот вопрос был вызван попыткой опробовать сотрудников script раньше. К сожалению, для этого потребовалась Image Processing Toolbox, которой у меня сейчас нет. Полезное сообщение об ошибке позволило бы сэкономить время, пытаясь диагностировать проблему. Теперь я буду ждать скомпилированную версию перед ее тестированием.

Теги:

6 ответов

27
Лучший ответ

Один недостаток функции ver заключается в том, что он сообщает только то, что установлено, а не то, что имеет доступную лицензию. Возможно установить инструментарий и не использовать лицензию (или все доступные лицензии могут быть проверены другими пользователями). Лучшим выбором является функция license, которая (как вы указали) требует уникальной "строки функций" для каждого инструментария.

Здесь приведен более старый список строк функций для различных наборов инструментов, взятых из ныне не существующего потока новостей (ссылка теперь мертва):

featureStr = {'Aerospace_Blockset'; ...
              'Aerospace_Toolbox'; ...
              'Bioinformatics_Toolbox'; ...
              'Communication_Blocks'; ...
              'Communication_Toolbox'; ...
              'Compiler'; ...
              'Control_Toolbox'; ...
              'Curve_Fitting_Toolbox'; ...
              'Data_Acq_Toolbox'; ...
              'Database_Toolbox'; ...
              'Datafeed_Toolbox'; ...
              'Dial_and_Gauge_Blocks'; ...
              'Distrib_Computing_Toolbox'; ...
              'Econometrics_Toolbox'; ...
              'EDA_Simulator_Link_DS'; ...
              'Embedded_Target_c166'; ...
              'Embedded_Target_c2000'; ...
              'Embedded_Target_c6000'; ...
              'Embedded_Target_MPC555'; ...
              'Excel_Link'; ...
              'Filter_Design_HDL_Coder'; ...
              'Filter_Design_Toolbox'; ...
              'Fin_Derivatives_Toolbox'; ...
              'Financial_Toolbox'; ...
              'Fixed_Income_Toolbox'; ...
              'Fixed_Point_Toolbox'; ...
              'Fixed-Point_Blocks'; ...
              'Fuzzy_Toolbox'; ...
              'GADS_Toolbox'; ...
              'IDE_Link_MU'; ...
              'Identification_Toolbox'; ...
              'Image_Acquisition_Toolbox'; ...
              'Image_Toolbox'; ...
              'Instr_Control_Toolbox'; ...
              'Link_for_Incisive'; ...
              'Link_for_ModelSim'; ...
              'Link_for_Tasking'; ...
              'Link_for_VisualDSP'; ...
              'MAP_Toolbox'; ...
              'MATLAB'; ...
              'MATLAB_Builder_for_dot_Net'; ...
              'MATLAB_Builder_for_Java'; ...
              'MATLAB_Distrib_Comp_Engine'; ...
              'MATLAB_Excel_Builder'; ...
              'MATLAB_Link_for_CCS'; ...
              'MATLAB_Report_Gen'; ...
              'MBC_Toolbox'; ...
              'MPC_Toolbox'; ...
              'NCD_Toolbox'; ...
              'Neural_Network_Toolbox'; ...
              'OPC_Toolbox'; ...
              'Optimization_Toolbox'; ...
              'PDE_Toolbox'; ...
              'Power_System_Blocks'; ...
              'Real-Time_Win_Target'; ...
              'Real-Time_Workshop'; ...
              'RF_Blockset'; ...
              'RF_Toolbox'; ...
              'Robust_Toolbox'; ...
              'RTW_Embedded_Coder'; ...
              'Signal_Blocks'; ...
              'Signal_Toolbox'; ...
              'SimBiology'; ...
              'SimDriveline'; ...
              'SimElectronics'; ...
              'SimEvents'; ...
              'SimHydraulics'; ...
              'SimMechanics'; ...
              'Simscape'; ...
              'SIMULINK'; ...
              'Simulink_Control_Design'; ...
              'Simulink_Design_Verifier'; ...
              'Simulink_HDL_Coder'; ...
              'Simulink_Param_Estimation'; ...
              'SIMULINK_Report_Gen'; ...
              'SL_Verification_Validation'; ...
              'Spline_Toolbox'; ...
              'Stateflow'; ...
              'Stateflow_Coder'; ...
              'Statistics_Toolbox'; ...
              'Symbolic_Toolbox'; ...
              'SystemTest'; ...
              'Video_and_Image_Blockset'; ...
              'Virtual_Reality_Toolbox'; ...
              'Wavelet_Toolbox'; ...
              'XPC_Embedded_Option'; ...
              'XPC_Target'};

Это охватывает многие из распространенных, но не является исчерпывающим и не включает строки функций для новых наборов инструментов. Кажется, что нет доступных легко доступных списков текущих строк функций для всех наборов инструментов MathWorks. Я считаю, что вы можете найти их в строке "INCREMENT" в файле лицензии или (как упоминается в комментарии в комментарии) вы можете вызвать функцию из заданного инструментария, а затем использовать license('inuse') чтобы получить строку функции из отображаемый список используемых в данный момент панелей инструментов. Однако для обоих указанных выше параметров требуется уже имеющаяся лицензия.

Используя приведенный выше список строк функций и license функции, вы можете проверить, какие панели инструментов у вас есть лицензия для использования. Следующий код проверяет лицензии для всего списка выше:

index = cellfun(@(f) license('test', f), featureStr);
availableFeatures = featureStr(logical(index));

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

index = cellfun(@(f) license('checkout', f), availableFeatures);
checkedOutFeatures = availableFeatures(logical(index));

СЛОВО ПРЕДУПРЕЖДЕНИЯ !:

Как упоминает Jason S в комментарии ниже, это плохая идея проверить лицензии волей-неволей, так как они не будут выпущены до закрытия MATLAB. Вы должны только проверить лицензию, которая, как вам известно, вам понадобится для данного приложения! Обычно лицензии не проверяются до тех пор, пока вы не попытаетесь использовать функцию из данного инструментария. Например:

>> license('inuse')
matlab
>> gaussFilter = fspecial('gaussian');  % An Image Processing Toolbox function
>> license('inuse')
image_toolbox
matlab
  • 0
    Я полагаю, что лучший способ - использовать команду ver и license. Таким образом, вы можете проинформировать пользователя, не хватает ли ему набора инструментов в целом, или ему просто нужно подождать / закричать, пока лицензия не станет доступной.
  • 7
    Обратите внимание, что проверка лицензии только для того, чтобы проверить, можете ли вы проверить лицензию, является плохой вещью, поскольку в MATLAB лицензия не будет и не может быть выпущена, пока вы полностью не закроете MATLAB. Это не «хорошо играет» с общим лицензированием (особенно учитывая низкую цену Mathworks на наборы сетевых лицензий)
Показать ещё 5 комментариев
11

Веру кажется, что это нужно, и синтаксический анализ не должен быть таким трудным. Давайте посмотрим:

function tf = areTheseToolboxesInstalled(requiredToolboxes)
%ARETHESETOOLBOXESINSTALLED takes a cell array of toolbox names and checks whether they are currently installed
% SYNOPSIS tf = areTheseToolboxesInstalled(requiredToolboxes)
%
% INPUT requiredToolboxes: cell array with toolbox names to test for. Eg. 
%        {'MATLAB','Image Processing Toolbox'}
%
% OUTPUT tf: true or false if the required toolboxes are installed or not
%%%%%%%%%%%%%%%%%%%%%%%%%%

% get all installed toolbox names
v = ver;
% collect the names in a cell array
[installedToolboxes{1:length(v)}] = deal(v.Name);

% check 
tf = all(ismember(requiredToolboxes,installedToolboxes));

Кстати, если вам нужно проверить версии, verLessThan является вашим другом.

  • 0
    Спасибо за указание verLessThan.
  • 0
    Спасибо за код!
7

Я знаю, что это довольно старый вопрос, но действительно простой ответ на самом деле находится в вопросе (проанализируйте вывод ver)....

>> v = ver;
>> setdiff({v.Name}, 'MATLAB')'

ans = 

    'Aerospace Blockset'
    'Aerospace Toolbox'
    'Bioinformatics Toolbox'
    'Communications System Toolbox'
    'Computer Vision System Toolbox'
    'Control System Toolbox'
    'Conversion to SeDuMi'
    'Curve Fitting Toolbox'
    'DSP System Toolbox'
    'Database Toolbox'
    'Datafeed Toolbox'
    'Econometrics Toolbox'
    'Embedded Coder'
    'Financial Derivatives Toolbox'
    'Financial Toolbox'
    'Fixed-Income Toolbox'
    'Fixed-Point Toolbox'
    'Fuzzy Logic Toolbox'
    'Global Optimization Toolbox'
    'Image Acquisition Toolbox'
    'Image Processing Toolbox'
    'Instrument Control Toolbox'
    'MATLAB Coder'
    'MATLAB Distributed Computing Server'
    'MATLAB Report Generator'
    'Mapping Toolbox'
    'Model Predictive Control Toolbox'
    'Neural Network Toolbox'
    'Optimization Toolbox'
    'Parallel Computing Toolbox'
    'Partial Differential Equation Toolbox'
    'Phased Array System Toolbox'
    'RF Toolbox'
    'Robust Control Toolbox'
    'Signal Processing Toolbox'
    'SimBiology'
    'SimDriveline'
    'SimElectronics'
    'SimEvents'
    'SimHydraulics'
    'SimMechanics'
    'SimPowerSystems'
    'SimRF'
    'Simscape'
    'Simulink'
    'Simulink 3D Animation'
    'Simulink Coder'
    'Simulink Control Design'
    'Simulink Design Optimization'
    'Simulink Fixed Point'
    'Simulink Report Generator'
    'Simulink Verification and Validation'
    'Stateflow'
    'Statistical Graphics Toolbox'
    'Statistical Parametric Mapping'
    'Statistics Toolbox'
    'Symbolic Math Toolbox'
    'System Identification Toolbox'
    'SystemTest'
    'Wavelet Toolbox'
  • 1
    Самый простой способ сделать это. Никаких излишне сложных функций, разбора и чего еще нет ...
3

Просто введите ver, чтобы отобразить полный список наборов инструментов, установленных в вашем matlab.

2

быстрый способ состоит в том, чтобы перечислить содержимое каталога инструментов:

l = ls( toolboxdir('') )

используя этот список (за исключением нескольких каталогов: общий, локальный), вы можете узнать версию, установленную на панели инструментов, используя ver:

v = ver('nnet')

в качестве ссылки, вот список названий директорий ящиков инструментов, которые у меня были:

bioinfo 
curvefit
database
gads    
ident   
images  
nnet    
optim   
pde     
signal  
stats   
wavelet 
1

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

somefunction может не работать по многим причинам, например, если вам не хватает доступных лицензий или что набор инструментов не установлен в вашей системе. try/catch позволяет вам изящно прекратить и дать пользователю значимое сообщение о том, почему невозможно выполнить запрошенную операцию (прямо сейчас).

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню