Как можно проверить наличие установленных инструментов MATLAB в скрипте / функции? - PullRequest
34 голосов
/ 14 января 2010

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

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

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

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

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

a = 

    feature: 'matlab'
       user: <username>

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

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

Ответы [ 6 ]

27 голосов
/ 14 января 2010

Одним из недостатков функции 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));

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

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

>> license('inuse')
matlab
>> gaussFilter = fspecial('gaussian');  % An Image Processing Toolbox function
>> license('inuse')
image_toolbox
matlab
11 голосов
/ 14 января 2010

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

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 ваш друг.

7 голосов
/ 14 ноября 2011

Я знаю, что это довольно старый вопрос, но на самом деле в нем есть действительно простой ответ (проанализируйте вывод 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'
4 голосов
/ 21 октября 2012

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

2 голосов
/ 14 января 2010

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

l = ls( toolboxdir('') )

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

v = ver('nnet')

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

bioinfo 
curvefit
database
gads    
ident   
images  
nnet    
optim   
pde     
signal  
stats   
wavelet 
1 голос
/ 25 августа 2011

Практическим подходом было бы начать код с оператора try <em>somefunction</em> catch, где <em>somefunction</em> уникален для нужного вам набора инструментов.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...