开发者

How would one check for installed MATLAB toolboxes in a script/function?

How would one check for installed MATLAB toolboxes in a script/function? (checking toolbox versions would also be good!) This could provide a quick and useful error message when someone attempts to run a script without a required toolbox.

A quick, albeit rough, solution that comes to mind is parsing the text output of the ver command. I wonder if there's a better way.

Some quick searching revealed ver product or the license function with the 'test' argument may be useful, but I could not find a mapping of toolbox names (ie. 'Image Processing Toolbox') to product names (ie. 'contro开发者_开发知识库l') or feature names (ie. image_toolbox).

Furthermore, when I ran license('inuse'), I only received the following:

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

a = 

    feature: 'matlab'
       user: <username>

I hoped for a list of the many toolboxes I have access to.

This question was prompted by trying to test a co-workers script early. Unfortunately, it required the Image Processing Toolbox, which I currently lack. A useful error message would've saved time trying to diagnose the problem. Now I'll wait for a compiled version before testing it.


One drawback to the ver function is that it only tells you what's installed, not what has an available license. It's possible to have a toolbox installed and no license to use it (or all the available licenses could be checked out by other users). A better choice is the license function, which (as you pointed out) requires a unique "feature string" for each toolbox.

Here's an older list of feature strings for various toolboxes taken from a now-defunct newsgroup thread (link is now dead):

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'};

This covers many of the common ones, but isn't exhaustive and doesn't include feature strings for newer toolboxes. There doesn't appear to be any readily-available list of current feature strings for all MathWorks toolboxes. I believe you can find them on the "INCREMENT" lines in a license file, or (as vlee mentions in a comment) you can call a function from a given toolbox and then use license('inuse') to get the feature string from the displayed list of toolboxes currently being used. However, both of the above options require an available license already.

Using the above list of feature strings and the function license, you can check which toolboxes you have a license to use. The following code checks for licenses for the entire list above:

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

However, the above just confirms that the license exists, not that it can be checked out. The license could have expired or all the available licenses could be checked out by other users. To be absolutely certain that you will be able to use the available toolboxes, you can actually try to check out a license for the ones you need and test to see if you were successful. The following code attempts to check out a license for all the available toolboxes found above:

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

WORD OF WARNING!:

As Jason S mentions in a comment below, it's a bad idea to check out licenses willy-nilly, since they won't be released until you close MATLAB. You should only check out a license that you know you will need for a given application! Normally, licenses aren't checked out until you try to use a function from a given toolbox. For example:

>> license('inuse')
matlab
>> gaussFilter = fspecial('gaussian');  % An Image Processing Toolbox function
>> license('inuse')
image_toolbox
matlab


Ver seems like the way to go, and parsing shouldn't be that hard. Let's see:

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));

By the way, if you need to check for versions, verLessThan is your friend.


I know this is a pretty old question, but a really simple answer is actually in the question (parse the output of 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'


Simply typing ver would display the complete list of toolboxes installed in your matlab.


a quick way is to list the contents of the toolboxes directory:

l = ls( toolboxdir('') )

using that list (excluding a few directories: shared,local), you can find out the version installed of a toolbox using ver:

v = ver('nnet')

as a reference, here's a list of the toolboxes directory names I had:

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


A practical approach would be to start your code with a try somefunction catch statement, where somefunction is unique to the toolbox you need.

The somefunction may fail for many reasons, for example that you lack available licenses or that the toolbox is not installed on your system. The try/catch allows you to abort gracefully and give the user a meaningful message as to exactly why it's not possible to perform the requested operation (right now).

The downside is that that is a less generic method. It lacks elegance and it is sensitive to namespace errors. The upside is that it tests if somefunction actually works. If it is used wisely it should grab hold of shared licenses only when you actually need them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜