如何测试MATLAB的最新版本?
我想要实现的一个函数需要知道当前版本的MATLAB是否至少与如何测试MATLAB的最新版本?,matlab,Matlab,我想要实现的一个函数需要知道当前版本的MATLAB是否至少与R2014a一样新 是否有可靠且受支持的方法来执行此检查 (我的意思是说,我对脆弱的黑客不感兴趣,比如解析版本返回的字符串等。) 顺便说一句,在这种情况下,我希望进行此检查的原因是知道我可以使用函数matlab.lang.MakeUniqueString。如果有一种健壮的、受支持的方法来检查此函数的可用性,我会使用它,而不是测试当前的MATLAB是否足够新。不幸的是,似乎没有这样的检查:exist对我能找到的每个变量返回false作为
R2014a
一样新
是否有可靠且受支持的方法来执行此检查
(我的意思是说,我对脆弱的黑客不感兴趣,比如解析版本返回的字符串等。)
顺便说一句,在这种情况下,我希望进行此检查的原因是知道我可以使用函数
matlab.lang.MakeUniqueString
。如果有一种健壮的、受支持的方法来检查此函数的可用性,我会使用它,而不是测试当前的MATLAB是否足够新。不幸的是,似乎没有这样的检查:exist
对我能找到的每个变量返回false作为这个函数的名称。同样,我可以想到一些脆弱的黑客来模拟适当的测试(例如,,它('matlab.lang.makeUniqueStrings')
),但它们几乎不比我上面提到的版本测试黑客好多少
我找到的最佳解决方案是在try catch
块中使用matlab.lang.makeUniqueStrings
运行命令。这仍然是一个脆弱的黑客,因为MATLAB
没有提供一种健壮的内置方法来捕获特定的异常
瞧,这都是关于选择最不可怕的黑客。测试当前版本是否足够新(即使此测试是脆弱的黑客攻击),至少具有足够通用的优点,可以插入某些功能,并且至少包含脆弱的黑客代码的激增。最好的方法是使用命令,并适当地解析字符串
[v d] = version
查看R2014a的输出,并适当设置值。您可以使用MATLAB命令进行测试-
['Release R' version('-release')]
样本运行-
>> ['Release R' version('-release')]
ans =
Release R2012a
检查您的MATLAB版本是否为最新版本(R2014a)——
如果是最新版本,上述命令将返回1
,否则返回0
我会使用以下功能:
verLessThan('matlab', '8.3')
如果当前使用的版本早于8.3(R2014a),则返回true(1),否则返回false(0)。不需要字符串解析
然后您可以这样使用它:
if ~verLessThan('matlab', '8.3')
% Run code using matlab.lang.makeUniqueStrings
end
如果只需要关注较新的版本,请使用
verLessThan
命令。然而,verLessThan
大约是在2006a左右引入的;如果需要支持早于此的版本,则需要使用version
命令的输出
或者,您可以可靠地测试matlab.lang.MakeUniqueString
是否存在。首先,使用m=meta.package.fromName('matlab.lang')
检索引用包的meta.package
对象。如果m
为空,则包不存在。假设m
不为空,检查m
的FunctionList
属性以查看是否存在makeUniqueStrings
。(还有一个ClassList
属性)
最后,MATLAB确实提供了捕获特定异常的方法。使用
catch myError
代替简单的catch
。变量myError
将是meexception
类型的对象,可在catch
块中使用。您可以测试异常的标识符
和消息
属性,并适当地处理不同的异常,包括重新引用未处理的异常。测试版本号几乎不是一个好主意。如果您真的想要健壮性(同时还需要可移植性),您应该始终检查功能,而不要检查版本
如果从未来版本的Matlab中删除了您需要的功能之一,会发生什么情况?还是它的工作方式发生了变化?(这比人们想象的要普遍得多)。或者,如果有人想在与Matlab兼容的系统中使用您的代码,而该系统确实具有您的代码所需的功能
有一些与Matlab相关的autoconf宏(尽管我从未使用过)。或者,您可以用Matlab语言编写自己的简单检查。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
在MathWorks更改ID字符串之前保持稳定
最后一句话:检查功能是不够的:如果MathWorks决定更改函数签名怎么办?还是输出参数列表?还是
在一种本身并不健壮的语言中,没有真正健壮的方法。像语言允许的那样健壮,但是没有更多。你能解释为什么你认为解析版本字符串易碎吗?在您看来,最好的解决方案是什么?@RodyOldenhuis:解析这样一个字符串需要对其结构做出假设,TMW没有承诺支持这些假设。因此,依赖于这些假设的代码是脆弱的。相比之下,诸如
verLessThan
之类的方法意味着TMW承诺支持特定的版本号测试方法。因此,TMW有责任确保这种方法继续有效,即使他们决定在将来更改版本字符串的格式……还有我的第二个问题?你很正确,MathWorks在保持向后兼容性方面不是很强,或者甚至在一个地方记录不同版本之间的确切变化(您如何找到引入某些功能的版本?)。从任何意义上讲,最健壮的方法是在MatlabR2006a中编写所有代码(或您希望支持的最旧版本),并且只需远离较新的特性/结构。但即使这样,您也必须检查这个“受支持的最低版本”,这是通过解析版本字符串来完成的(您认为verLessThan
如何工作?)另一个选项(我经常使用的选项)是不进行任何检查,而只是清楚地记录它保证工作的版本。如果这对您来说是一个可行的选择,则取决于您的预期用户。+1
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