2010-01-13 8 views
32

¿Cómo se verificarían las cajas de herramientas MATLAB instaladas en un script/función? (¡Comprobar las versiones de la caja de herramientas también sería bueno!) Esto podría proporcionar un mensaje de error rápido y útil cuando alguien intenta ejecutar una secuencia de comandos sin una caja de herramientas requerida.¿Cómo se verificarían las cajas de herramientas MATLAB instaladas en un script/función?

Una solución rápida, aunque aproximada, que viene a la mente es analizar el resultado de texto del comando ver. Me pregunto si hay una mejor manera.

un poco de búsqueda rápida reveló ver product o la función license con el argumento 'test' puede ser útil, pero no pudo encontrar un mapeo de los nombres de la caja de herramientas (es decir. 'Image Processing Toolbox') a los nombres de productos (es decir. 'control') o nombres de características (es decir. image_toolbox).

Por otra parte, cuando me encontré license('inuse'), sólo he recibido la siguiente:

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

a = 

    feature: 'matlab' 
     user: <username> 

me esperaba para una lista de las muchas cajas de herramientas que tengo acceso.

Esta pregunta fue provocada al intentar probar el script de compañeros de trabajo con anticipación. Desafortunadamente, requirió Image Processing Toolbox, que actualmente carezco. Un mensaje de error útil habría ahorrado tiempo tratando de diagnosticar el problema. Ahora esperaré una versión compilada antes de probarla.

Respuesta

26

Una desventaja de la función VER es que sólo le dice lo que es instalado, no lo que tiene una licencia disponible . Es posible tener una caja de herramientas instalada y sin licencia para usarla (o todas las licencias disponibles podrían ser revisadas por otros usuarios). Una mejor opción es la función LICENSE, que (como usted señaló) requiere una "cadena de características" única para cada caja de herramientas.

Hay una lista de cadenas de funciones para diferentes cajas de herramientas en this newsgroup thread:

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

El uso de esta lista y la función LICENSE, se puede comprobar qué cajas de herramientas que tiene una licencia de uso.El siguiente código comprueba de licencias para toda la lista anterior:

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

Sin embargo, lo anterior sólo confirma que existe la licencia , no que puede ser desprotegido . La licencia podría haber expirado o todas las licencias disponibles podrían ser revisadas por otros usuarios. Para estar absolutamente seguro de que podrá usar las cajas de herramientas disponibles, puede intentar sacar una licencia para las que necesita y probar para ver si tuvo éxito. El código siguiente intenta extraer una licencia para todas las cajas de herramientas disponibles que se encuentran por encima de:

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

NOTA:

Como Jason S menciones en un comentario más abajo, que es una mala idea para retirar licencias willy- no, ya que no se liberarán hasta que cierre MATLAB. ¡Solo debe sacar una licencia que sabe que necesitará para una aplicación determinada! Normalmente, las licencias no se desprotegen hasta que intente usar una función de una caja de herramientas determinada. Por ejemplo:

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

Supongo que el mejor método sería usar tanto el comando ver como el de licencia. De esta forma, puede informar al usuario si carecen por completo de una caja de herramientas, o si simplemente necesita esperar/gritar hasta que la licencia esté disponible. – Jonas

+6

Tenga en cuenta que retirar una licencia solo para ver si puede sacar una licencia es algo ** malo ** porque en MATLAB la licencia no se podrá liberar hasta que cierre MATLAB por completo. Esto no "funciona bien" con licencias compartidas (especialmente teniendo en cuenta los bajos precios de Mathworks para cajas de herramientas de licencia de red) –

+2

(sin embargo, si necesita usar esa caja de herramientas de todos modos en la función, debería estar bien) –

2

una manera rápida es listar el contenido del directorio de cajas de herramientas:

l = ls(toolboxdir('')) 

utilizando esa lista (con exclusión de algunos directorios: compartida, local), se puede averiguar la versión instalada de una caja de herramientas usando ver :

v = ver('nnet') 

como referencia, he aquí una lista de los nombres de directorio cajas de herramientas que tenía:

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

Ver parece ser el camino a seguir, y el análisis no debería ser tan difícil. Veamos:

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

Por cierto, si usted necesita para comprobar si hay versiones, verLessThan es su amigo.

+0

Gracias por señalar verLessThan. – vlee

+0

¡Gracias por el código! – sum1stolemyname

1

Un enfoque práctico sería comenzar su código con una declaración try somefunction catch, donde somefunction es exclusivo de la caja de herramientas que necesita.

El somefunction puede fallar por muchas razones, por ejemplo, que no tiene licencias disponibles o que la caja de herramientas no está instalada en su sistema. El try/catch le permite abortar correctamente y darle al usuario un mensaje significativo sobre por qué no es posible realizar la operación solicitada (en este momento).

El inconveniente es que se trata de un método menos genérico. Le falta elegancia y es sensible a los errores del espacio de nombres. Lo bueno es que prueba si realmente funciona el somefunction. Si se usa sabiamente, debería tomar posesión de licencias compartidas solo cuando realmente las necesite.

7

Sé que esto es una pregunta bastante viejo, pero una respuesta muy simple es en realidad en la pregunta (analizar la salida 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' 
+1

La forma más fácil de hacerlo. Sin funciones complicadas, análisis y qué más no ... – rbaleksandar

3

Simplemente escribiendo ver sería mostrar el listado completo de cajas de herramientas instaladas en su matlab.

Cuestiones relacionadas