web-dev-qa-db-fra.com

Comment vérifier les boîtes à outils MATLAB installées dans un script / une fonction?

Comment vérifier les boîtes à outils MATLAB installées dans un script/une fonction? (la vérification des versions de la boîte à outils serait également une bonne chose!) Cela pourrait fournir un message d'erreur rapide et utile lorsque quelqu'un tente d'exécuter un script sans la boîte à outils requise.

Une solution rapide, quoique approximative, qui vient à l'esprit est d'analyser la sortie texte de la commande ver . Je me demande s'il y a une meilleure façon.

Une recherche rapide a révélé ver product Ou la fonction license avec l'argument 'test' Peut être utile, mais je n'ai pas trouvé de mappage des noms de boîte à outils ( ie. 'Image Processing Toolbox') aux noms de produits (ie. 'control') ou aux noms de fonctionnalités (ie. image_toolbox).

De plus, lorsque j'ai exécuté license('inuse'), je n'ai reçu que les éléments suivants:

 >> a = licence ("inuse"); a 
 
 a = 
 
 fonctionnalité: 'matlab' 
 utilisateur: <nom d'utilisateur> 

J'espérais une liste des nombreuses boîtes à outils auxquelles j'ai accès.

Cette question a été posée en essayant de tester un script de collègues tôt. Malheureusement, cela nécessitait la boîte à outils de traitement d'image, qui me manque actuellement. Un message d'erreur utile aurait permis de gagner du temps en essayant de diagnostiquer le problème. J'attends maintenant une version compilée avant de la tester.

34
vlee

Un inconvénient de la fonction ver est qu'elle ne vous indique que ce qui est installé, pas ce qui a une licence disponible =. Il est possible d'avoir une boîte à outils installée et aucune licence pour l'utiliser (ou toutes les licences disponibles pourraient être vérifiées par d'autres utilisateurs). Un meilleur choix est la fonction license , qui (comme vous l'avez souligné) nécessite un "chaîne de fonctionnalité" unique pour chaque boîte à outils.

Voici une ancienne liste de chaînes de fonctionnalités pour diverses boîtes à outils extraites d'un désormais disparu fil de discussion (le lien est maintenant mort):

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

Cela couvre la plupart des plus courants, mais n'est pas exhaustif et n'inclut pas de chaînes de fonctionnalités pour les boîtes à outils plus récentes. Il ne semble pas y avoir de liste facilement disponible de chaînes de fonctionnalités actuelles pour toutes les boîtes à outils MathWorks. Je pense que vous pouvez les trouver sur les lignes "INCREMENT" dans un fichier de licence, ou ( comme Vlee le mentionne dans un commentaire ) vous pouvez appeler une fonction à partir d'une boîte à outils donnée, puis utiliser license('inuse') pour obtenir la chaîne de fonctions de la liste affichée des boîtes à outils actuellement utilisées. Cependant, les deux options ci-dessus nécessitent déjà une licence disponible.

En utilisant la liste ci-dessus des chaînes de fonctionnalités et la fonction license , vous pouvez vérifier quelles boîtes à outils vous avez une licence à utiliser. Le code suivant vérifie les licences pour la liste complète ci-dessus:

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

Cependant, ce qui précède confirme simplement que la licence existe, pas qu'elle peut être retirée. La licence a peut-être expiré ou toutes les licences disponibles ont pu être extraites par d'autres utilisateurs. Pour être absolument certain que vous pourrez utiliser les boîtes à outils disponibles, vous pouvez réellement essayer de vérifier une licence pour celles dont vous avez besoin et tester pour voir si vous avez réussi. Le code suivant tente d'extraire une licence pour toutes les boîtes à outils disponibles trouvées ci-dessus:

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

Mot d'avertissement!:

Comme Jason S le mentionne dans un commentaire ci-dessous , c'est une mauvaise idée de vérifier les licences bon gré mal gré, car elles ne seront pas publiées avant la fermeture de MATLAB. Vous ne devriez vérifier qu'une licence dont vous savez que vous aurez besoin pour une application donnée! Normalement, les licences ne sont extraites que lorsque vous essayez d'utiliser un fonction d'une boîte à outils donnée. Par exemple:

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

Ver semble être la voie à suivre, et l'analyse ne devrait pas être si difficile. Voyons voir:

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

Soit dit en passant, si vous devez vérifier les versions, verLessThan est votre ami.

11
Jonas

Je sais que c'est une assez vieille question, mais une réponse vraiment simple est en fait dans la question (analyser la sortie de 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'
7
tdc

Il suffit de taper ver pour afficher la liste complète des boîtes à outils installées dans votre matlab.

4
user1763518

un moyen rapide consiste à répertorier le contenu du répertoire des boîtes à outils:

l = ls( toolboxdir('') )

en utilisant cette liste (à l'exception de quelques répertoires: partagés, locaux), vous pouvez trouver la version installée d'une boîte à outils en utilisant ver :

v = ver('nnet')

comme référence, voici une liste des noms de répertoires des boîtes à outils que j'avais:

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

Une approche pratique serait de commencer votre code avec un try somefunction catch instruction, où somefunction est unique à la boîte à outils dont vous avez besoin.

Le somefunction peut échouer pour de nombreuses raisons, par exemple parce que vous n'avez pas les licences disponibles ou que la boîte à outils n'est pas installée sur votre système. Le try/catch vous permet d'interrompre gracieusement et de donner à l'utilisateur un message significatif expliquant pourquoi il n'est pas possible d'effectuer l'opération demandée (pour le moment).

L'inconvénient est qu'il s'agit d'une méthode moins générique. Il manque d'élégance et est sensible aux erreurs d'espace de noms. L'avantage est qu'il teste si somefunction fonctionne réellement. S'il est utilisé à bon escient, il ne devrait saisir les licences partagées que lorsque vous en avez réellement besoin.

1
jankj