【问题标题】:How would one check for installed MATLAB toolboxes in a script/function?如何在脚本/函数中检查已安装的 MATLAB 工具箱?
【发布时间】:2018-04-10 23:44:50
【问题描述】:

如何在脚本/函数中检查已安装的 MATLAB 工具箱? (检查工具箱版本也很好!)当有人尝试在没有所需工具箱的情况下运行脚本时,这可以提供快速而有用的错误消息。

想到的一个快速但粗略的解决方案是解析ver 命令的文本输出。不知道有没有更好的办法。

一些快速搜索显示ver product 或带有'test' 参数的license 函数可能有用,但我找不到工具箱名称(即'Image Processing Toolbox')到产品名称(即@ 987654328@)或功能名称(即image_toolbox)。

此外,当我运行license('inuse') 时,我只收到以下信息:

>> a = license('inuse');一个 一个= 特征:'matlab' 用户:

我希望能列出我可以访问的许多工具箱。

这个问题是在早期尝试测试同事脚本时提出的。不幸的是,它需要我目前缺少的图像处理工具箱。一条有用的错误消息将节省尝试诊断问题的时间。现在我会在测试之前等待编译版本。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    ver 函数的一个缺点是它只告诉您已安装 的内容,而不是可用的许可证。可能安装了一个工具箱但没有使用它的许可证(或者所有可用的许可证都可以被其他用户签出)。更好的选择是 license 函数,(正如您所指出的)每个工具箱都需要一个唯一的 "feature string"

    以下是从现已失效的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'};
    

    这涵盖了许多常见的,但并不详尽,也不包括新工具箱的功能字符串。对于所有 MathWorks 工具箱,似乎没有任何现成的当前特征字符串列表。我相信您可以在许可证文件的“INCREMENT”行中找到它们,或者(as vlee mentions in a comment)您可以从给定工具箱中调用一个函数,然后使用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));
    

    警告!:

    As Jason S mentions in a comment below,随便检查许可证是个坏主意,因为在您关闭 MATLAB 之前它们不会被释放。 您应该只签出您知道给定应用程序需要的许可证! 通常,在您尝试使用给定工具箱中的功能之前,不会签出许可证。例如:

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

    【讨论】:

    • 请注意,签出许可证只是为了查看您是否可以签出许可证是一个的事情,因为在 MATLAB 中,在您关闭 MATLAB 之前,许可证不会也无法释放共。这与共享许可“玩得很好”(尤其是考虑到 Mathworks 对网络许可工具箱的定价不佳)
    • (但是如果你需要在函数中使用那个工具箱应该没问题)
    • @Jason:你是对的。检查许可证只是为了看看你是否可以是一件坏事。我只是建议在您真正需要它的情况下这样做,但我认为我没有清楚地说明这一点。我会澄清的。
    • 另外,感谢“inuse”的解释,我现在可以通过简单地使用工具箱中的一个函数然后运行许可证(“inuse”)来获取我拥有的任何工具箱的功能名称。嗯,标记不适用于 cmets,doh!这是一个内联示例: fmdemod(ones(1,100), 10, 20, 1);许可证(“正在使用”)。返回:communication_toolbox、matlab、signal_toolbox
    • 另一个警告:当作为参数传递给“ver”时,“ver”显示的工具箱名称可能与工具箱的名称不同,后者也可能与许可证功能名称不同:例如'优化工具箱'/'optim'/'optimization_toolbox'
    【解决方案2】:

    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 是您的朋友。

    【讨论】:

      【解决方案3】:

      我知道这是一个很老的问题,但实际上是一个非常简单的答案(解析 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】:

        只需键入 ver 即可显示安装在您的 matlab 中的工具箱的完整列表。

        【讨论】:

          【解决方案5】:

          一种快速的方法是列出工具箱目录的内容:

          l = ls( toolboxdir('') )
          

          使用该列表(不包括几个目录:shared、local),您可以使用ver找到工具箱的安装版本:

          v = ver('nnet')
          

          作为参考,这是我拥有的工具箱目录名称列表:

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

          【讨论】:

            【解决方案6】:

            一种实用的方法是使用try <em>somefunction</em> catch 语句开始您的代码,其中<em>somefunction</em> 是您需要的工具箱所独有的。

            <em>somefunction</em> 失败的原因有很多,例如您缺少可用的许可证或您的系统上没有安装工具箱。 try/catch 允许您优雅地中止并给用户一个有意义的消息,说明为什么不能执行请求的操作(现在)。

            缺点是这是一种不太通用的方法。它缺乏优雅,并且对命名空间错误很敏感。好处是它测试<em>somefunction</em> 是否真的有效。如果使用得当,它应该仅在您真正需要它们时才获取共享许可证。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-24
              • 1970-01-01
              • 1970-01-01
              • 2018-05-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多