Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试MATLAB的最新版本?_Matlab - Fatal编程技术网

如何测试MATLAB的最新版本?

如何测试MATLAB的最新版本?,matlab,Matlab,我想要实现的一个函数需要知道当前版本的MATLAB是否至少与R2014a一样新 是否有可靠且受支持的方法来执行此检查 (我的意思是说,我对脆弱的黑客不感兴趣,比如解析版本返回的字符串等。) 顺便说一句,在这种情况下,我希望进行此检查的原因是知道我可以使用函数matlab.lang.MakeUniqueString。如果有一种健壮的、受支持的方法来检查此函数的可用性,我会使用它,而不是测试当前的MATLAB是否足够新。不幸的是,似乎没有这样的检查:exist对我能找到的每个变量返回false作为

我想要实现的一个函数需要知道当前版本的MATLAB是否至少与
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