【问题标题】:How to test for recent-enough version of MATLAB?如何测试最新版本的 MATLAB?
【发布时间】:2014-03-27 15:16:40
【问题描述】:

我要实现的函数需要知道当前版本的 MATLAB 是否至少与R2014a 一样新。

是否有一种可靠且受支持的方法来执行此检查?

(使用“健壮,支持”我的意思是说我对解析版本返回的字符串等脆弱的hack不感兴趣)


顺便说一句,在这种情况下,我想要这个检查的原因是知道我可以使用函数matlab.lang.makeUniqueStrings。如果有一种强大、受支持的方法来检查此函数的可用性,我会使用它而不是测试当前的 MATLAB 是否足够新。不幸的是,似乎没有这样的检查:exist 对我可以为这个函数的名称提出的每个变体返回 false。同样,我可以想到一些脆弱的 hack 来模拟正确的测试(例如 which('matlab.lang.makeUniqueStrings')),但它们并不比我上面提到的版本测试 hack 好。

我发现的最佳解决方案是在 try-catch 块内使用 matlab.lang.makeUniqueStrings 运行命令。这仍然是一个脆弱的 hack,因为 MATLAB 没有提供强大的内置方法来捕获特定异常!

IOW,一切都是为了选择最不可怕的黑客。测试当前版本是否足够新(即使这个测试是一个脆弱的 hack)至少具有足够通用以坚持某些功能的优点,并且至少包含脆弱、hacky 代码的扩散。

【问题讨论】:

  • 您能解释一下为什么要考虑解析版本字符串fragile吗?在您看来,最好的解决方案是什么?
  • @RodyOldenhuis:解析这​​样的字符串涉及对其结构进行假设,TMW 没有承诺支持的假设。因此,依赖于这种假设的代码是脆弱的。相比之下,verLessThan 等方法意味着 TMW 承诺支持特定的版本号测试方式。然后,TMW 有责任确保这种方法继续有效,即使他们决定将来更改其版本字符串的格式。
  • ...还有我的第二个问题?
  • 你说得非常正确,MathWorks 在保持向后兼容性方面不是很强大,甚至只是在一个地方记录了版本之间的确切变化(你怎么能找到哪个版本引入了一些功能?)。无论如何,最稳健的方法是在 MATLAB R2006a(或您想要支持的任何最旧版本)中编写所有代码,并远离较新的功能/结构。但即便如此,您也必须通过解析版本字符串来检查这个“最低支持版本”(您认为verLessThan 是如何工作的?)
  • 另一种选择(我经常使用的一种)是不进行任何检查,而只是清楚地记录保证哪个版本继续工作。如果这对您来说是一个可行的选择,则取决于您的目标用户。

标签: matlab


【解决方案1】:

我会使用verLessThan 函数:

verLessThan('matlab', '8.3')

如果您使用的当前版本早于 8.3 (R2014a),这将返回 true (1),否则返回 false (0)。无需字符串解析。

你可以像这样使用它:

if ~verLessThan('matlab', '8.3')
  % Run code using matlab.lang.makeUniqueStrings
end

【讨论】:

  • 如何找到每个版本(即 R2014a)的版本号(即 8.3)?
【解决方案2】:

如果您只需要关心最近的版本,请使用verLessThan 命令。然而,verLessThan 是在 2006 年左右引入的;如果您需要支持更早的版本,则需要使用version 命令的输出。

或者,您可以稳健地测试matlab.lang.makeUniqueStrings 的存在。首先,使用m = meta.package.fromName('matlab.lang') 检索引用包的meta.package 对象。如果m 为空,则该包不存在。假设m 不为空,请检查m 的FunctionList 属性以查看makeUniqueStrings 是否存在。 (还有一个 ClassList 属性)。

最后,MATLAB 确实提供了一种捕获特定异常的方法。不要使用简单的catch,而是使用catch myError。变量myError 将是MException 类型的对象,在catch 块中可用。您可以测试异常的identifier 和message 属性,并适当处理不同的异常,包括重新抛出未处理的异常。

【讨论】:

  • +1。恕我直言,解析版本字符串是最“强大且受支持”的方式,因为它适用于所有 MATLAB 版本。此外,某些函数/类引入的 MATLAB 版本不会改变,因为 MATLAB 用户对其没有影响(但是 Octave 用户可能)。请注意,您的选项 2 和 3 将在旧版本的 MATLAB 中引发错误;因此,我不会称其为“稳健”。但是,嘿,因为 OP 并没有真正定义这些术语......:)
  • @RodyOldenhuis 是的,我同意 - 我通常只会解析 version,因为它几乎不比使用 verLessThan 难。你当然也是对的——我没有想到这一点——旧版本会在meta.package(8a 之前)和catch myError(尽管语法很老)出现错误。
【解决方案3】:

您可以使用 MATLAB 命令version 进行测试 -

['Release R' version('-release')]

示例运行 -

>> ['Release R' version('-release')]

ans =

Release R2012a

检查您的 MATLAB 版本是否为最新版本 (R2014a) -

strcmp (version('-release'),'R2014a')

如果是最新版本,上述命令将返回1,否则返回0。

【讨论】:

    【解决方案4】:

    最好的方法是使用version 命令,并适当地解析字符串。

    [v d] = version
    

    查看 R2014a 的输出,并适当设置您的值。

    【讨论】:

      【解决方案5】:

      Sam 的一个例子:

      try
          %// call to matlab.lang.makeUniqueStrings
      catch ME
          %// (use regexp here to include support for Octave) 
          if strcmpi(ME.identifier, 'MATLAB:undefinedVarOrClass')
              error('yourFcn:someID',...
                  'matlab.lang.makeUniqueStrings is not supported on your version of MATLAB.');
          else
              throw(ME);
          end
      end
      

      在 The MathWorks 更改 ID 字符串之前保持稳健。

      最后一句话:检查特征是不够的:如果 MathWorks 决定更改函数签名怎么办?还是输出参数列表?或者 ..?

      在一种本身并不健壮的语言中,没有真正健壮的方法。在语言允许的范围内尽可能健壮,但仅此而已。

      【讨论】:

      • 我从来没有写过我希望我的代码可以在每个版本的 MATLAB 上运行。 (我提出问题的动机与此无关,而是想要处理 TMW 的声明,即我的代码当前使用的函数已被弃用,并且可能会从未来的版本中删除。)此外,不用说这些条款诸如“一个健壮的解决方案”并不是指一些英雄般的天启证明级别的健壮性。即使使用像 MATLAB 这样的编程语言,一些解决方案也比其他解决方案相对更健壮。我认为没有理由不尝试更多...
      • ...健壮的解决方案(特别是当它像我已经接受的答案中所示的那样简单时),即使在 MATLAB 中,它也不会像它在其他语言。
      • @kjo 不用说,“健壮”一词在软件工程中没有普遍接受的定义,因此使其具有主观性。作为一名太空工程师,我的意思显然与你完全不同。看看这里所有的 cmets,我仍然不完全明白你想要完美的解决方案做什么。在你的书中什么是“稳健”?
      【解决方案6】:

      测试版本号几乎不是一个好主意。如果您真的想要健壮性(同时又需要可移植性),您应该始终检查功能,而不是版本。

      如果您需要的功能之一从未来版本的 Matlab 中删除,会发生什么情况?还是它的工作方式发生了变化? (这比人们预期的要普遍得多)。或者,如果有人想在具有您的代码所需功能的 Matlab 兼容系统中使用您的代码?

      周围有一些与 Matlab 相关的 autoconf 宏(虽然我从未使用过)。或者您可以用 Matlab 语言编写自己的简单检查。

      【讨论】:

      • 如果 MATLAB 有一种简单(即通用)、受支持的方法来测试功能(或者至少有一种像 verLessThan 一样简单和健壮的方法似乎用于测试版本),我会用它。 IMO,它没有(YMMV),因此“测试特征”的优越性问题变成了学术问题:“理论上”可能是正确的,但在这种特殊情况下非常值得商榷。
      • @kjo 功能测试不是该语言应该提供的。有一些特定的工具可以实现这一目的,例如我在回答中提到的 SCons 和 Autoconf。该项目可能是用 Matlab 编写的,但这并不构成关于 Matlab 编程的问题。这是一个关于软件工程的问题,因为其目的是让代码在不同于其开发的系统上运行,这绝对不是学术性的。
      • 嗯,你是建议测试功能的人;如果语言不支持它,那么我什至没有兴趣尝试推出自己的、不可避免的脆弱的功能测试实用程序。
      • +1,我完全支持你的观点(除了关于语言不必提供功能检查实用程序的部分......为什么不呢?)
      • -1 因为它不是真正的答案,并且“测试功能”至少与测试版本一样复杂,并且在许多情况下是“测试功能”的有用部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多