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


我想确保用户定义的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为我强制执行它。

下面是一个函数的示例,其中我想指定输入参数数据类型。它驻留在一个名为的文件中 strict_data_type_test.m 在MATLAB的当前路径中。在这个函数中,我想强制变量 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中进行严格的数据输入,但也许你们中的许多人都知道我无法找到的有用技巧,特性或语法。


4161
2018-02-05 17:29


起源

答案是不。你叫什么 is[TYPE]()是这样做的方式。或者阅读有关的内容 inputParser 类 这里。或写一个 mex 功能,如果你喜欢。如果强制执行类型并且用户传入错误类型,您会发生什么? - horchler
我同意其他人的观点 inputParser 是要走的路。看到 这里 总结和简明的例子。 - chappjc
响应horchler:我希望如果有一个类型强制执行并且用户从控制台传入了错误的类型,那么就会发生错误(我不必手动编写函数内部的错误),更重要的是如果一个用户在另一个脚本或函数中键入函数调用,然后MATLAB将函数调用突出显示为错误,向用户显示它不正确而无需运行脚本/函数(“编译器强制执行”)。 - Babak


答案:


validateattributes 如果您的案例有适当的属性,也可能适合您。例如,如果要强制yes_or_no是逻辑标量,则可以尝试:

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

否则可能是像'非空'那样的属性。


6
2018-02-05 18:18



您可以使用用户定义的类,因此它适用于任何输入类型。我经常使用它。 - Marc


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

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

其他想法:

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

5
2018-02-12 18:35





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

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在运行之前编译代码,所以即使你需要测试很多条件,它也会非常快。运行探查器以查看。

在某些情况下(可能不是您的示例)的另一种选择是使用更懒惰的方法。此选项允许您的代码使用提供的任何输入运行,但使用a 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 在你的命令窗口中)无论好坏。


1
2018-02-05 18:05



但如果是,也可能抛出异常 x 不能乘以 -5 (也许它是一个图形句柄?)。 - Cris Luengo


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

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

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

顺便说一下:看看像Matlab这样的一些函数 edit integral 并检查tmw如何处理这个问题。


1
2018-02-05 17:44



是 edit integal 一个错字?我发现 edit 这似乎在编辑器中打开文件,我想 integal 是一个错字 integral。所以你是说我应该看一下内置MATLAB函数的代码,比如 integral,并看看那些强制输入参数数据类型如何? - Babak
是的,整合是一个错字。对于架构/模式的问题,我经常看一些内置函数,假设语言的设计者知道如何使用它;) - Daniel
太好了谢谢。 - Babak