是否可以在MATLAB中强制使用输入参数数据类型?

时间:2014-02-05 17:29:38

标签: matlab function types

我想确保用户定义的MATLAB函数(包含在m文件中)的输入参数属于某种类型。我知道MATLAB会自动将数据类型分配给变量(根据某些人的喜好和其他人的沮丧情绪),但我想知道在MATLAB中是否存在“严格数据类型”选项,或类似的东西,尤其是用于用户定义函数的输入参数。

我在这两个网页上找到了MATLAB“基础类”(数据类型)的有用解释:

http://www.mathworks.com/help/matlab/matlab_prog/fundamental-matlab-classes.html http://www.mathworks.com/help/matlab/data-types_data-types.html

但是,我一直无法找到严格数据类型问题的答案,特别是对于函数输入参数。我认为这将是一个非常基本的问题,已经在很多地方得到了回答,但经过广泛的搜索,我还没有找到一个确定的答案。目前,我已经使用is[TYPE]()函数手动检查数据类型并显示错误消息,如果它不符合,虽然这看起来很草率,我希望我能让MATLAB为我强制执行它。

下面是一个函数示例,其中我想指定输入参数数据类型。它驻留在MATLAB当前路径中名为strict_data_type_test.m的文件中。在这个函数中,我想强制变量yes_or_no是MATLAB的logical数据类型。我知道我可以使用islogical()函数来手动检查,但我的问题是,是否可以让MATLAB为我强制执行。我也知道任何非零double计算结果为true,零计算结果为false,但我想强制用户发送logical以确保错误的参数不会被意外发送,例如。以下是示例函数:

function y = strict_data_type_test( x, yes_or_no )

    % manual data type check can go here, but manual check is not desirable

    if (yes_or_no)
        y = 2 .* x;
    else
        y = -5 .* x;
    end

end

在输入参数变量名之前添加数据类型(与大多数编程语言一样)将数据类型文本视为另一个变量名而不是数据类型标识符。从那看起来似乎无论如何都无法在MATLAB中进行严格的数据输入,但也许你们中的许多人都知道一些我无法找到的有用技巧,特性或语法。

4 个答案:

答案 0 :(得分:6)

如果您的案例有适当的属性,

validateattributes也可能适合您。例如,如果要强制yes_or_no是逻辑标量,可以尝试:

validateattributes(yes_or_no,{'logical'},{'scalar'})

否则可能是'非空'等属性。

答案 1 :(得分:6)

我得到了一些很好的回应,所以我不能只选择一个作为“已接受的答案”,而是总结一下到目前为止我从你们那里学到的东西:

  • 不,MATLAB没有针对函数输入参数的内置严格数据类型
  • MATLAB在运行之前编译代码,因此手动验证检查不应该对性能造成太大影响(可以使用分析器来评估这个)
  • 存在许多有用的手动验证检查方法,这里按照与我试图做的最相关的最相关的顺序列出:
  • 我可以查看MathWorks提供的一些MATLAB函数(或统计工具箱函数),了解如何通过键入edit后跟函数名来验证输入参数。要查看的两个建议函数是normpdf()(来自统计工具箱)和integral()。我发现有助于查看的其他一些功能包括dot()cross()

其他想法:

  • 似乎inputParser类是以最专业的方式验证输入参数的总体共识。在a related (but not duplicate) stackoverflow post上注意到,较新的MathWorks函数倾向于使用此类,这表明它可能是最佳和最新的选择。
  • 由于MathWorks提供的MATLAB函数似乎没有强制执行严格的输入参数数据类型,这进一步表明,即使有可能这样做,也可能不是推荐的方法。
  • MATLAB似乎将“错误处理”和“异常处理”视为两个不同的概念。例如,这里有两个指向MATLAB文档中心的链接,它们显示了MathWorks如何以不同的方式考虑“错误处理”和“异常处理”:MathWorks Documentation Center article on Error HandlingMathWorks Documentation Center article on Exception Handling。已就此主题发布了相关的StackOverflow帖子,可以找到here (link)。我联系了MathWorks并在该帖子中添加了有关此主题的一些新信息,因此如果您有兴趣,可以通过以下链接阅读更多内容。

答案 2 :(得分:2)

Matlab提供了一个'inputParser',它允许检查输入。除此之外,你可以使用断言:

assert(islogical(yes_or_no),'logical input expected')

要确保输入参数的数量正确,请使用narginchk

btw:看看像edit integral这样的一些Matlab函数,看看tmw如何处理这个问题。

答案 3 :(得分:1)

您可能会发现编写此类代码很乏味或担心会降低性能:

if ~islogical(yes_or_no) && ~isscalar(yes_or_no)
    error('test:NotLogicalType','Second argument must be logical (Boolean).');
end
if yes_or_no
    y = 2 .* x;
else
    y = -5 .* x;
end

但是,回想一下,Matlab在运行之前编译代码,所以即使你需要测试很多条件,它也会非常快。运行探查器以查看。

在某些情况下(可能不是您的示例)的另一个选项是使用更加懒惰的方法。此选项允许您的代码使用提供的任何输入运行,但使用try/catch块来捕获任何错误:

try
    if yes_or_no
        y = 2 .* x;
    else
        y = -5 .* x;
    end
catch me
    ...
    error('test:NotLogicalType','Second argument must be logical (Boolean).');
    % rethrow(me);
end

如果yes_or_no是一个单元格数组,上面的代码会产生错误(虽然它仍会允许yes_or_no的非布尔值,非标量等值,但Matlab经常会过度宽容)。然后,您可以生成自定义错误消息,检测,抛出了什么类型的错误并尝试其他操作等。统计工具箱中的许多函数都使用此方法(例如,在命令窗口中键入edit normpdf)无论好坏。