我想确保用户定义的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中进行严格的数据输入,但也许你们中的许多人都知道我无法找到的有用技巧,特性或语法。
validateattributes
如果您的案例有适当的属性,也可能适合您。例如,如果要强制yes_or_no是逻辑标量,则可以尝试:
validateattributes(yes_or_no,{'logical'},{'scalar'})
否则可能是像'非空'那样的属性。
我得到了一些很好的回应,所以我不能只选择一个作为“已接受的答案”,而是总结一下到目前为止我从你们身上学到的东西:
- 不,MATLAB没有函数输入参数的内置严格数据类型
- MATLAB在运行之前编译代码,因此手动验证检查不应该对性能造成太大影响(可以使用分析器来评估这个)
- 存在许多有用的手动验证检查方法,这里按照与我试图做的最相关的最相关的顺序列出:
- 我可以查看一些MathWorks提供的MATLAB函数(或统计工具箱函数),了解如何通过键入来验证输入参数
edit
后跟功能名称。要看的两个建议功能是 normpdf()
(来自统计工具箱)和 integral()
。我发现其他一些有用的功能是 dot()
和 cross()
。
其他想法:
- 它似乎是
inputParser
class是用于验证输入参数的最专业方式的总体共识。有人指出 一个相关的(但不是重复的)stackoverflow帖子 新的MathWorks函数倾向于使用这个类,这表明它可能是最好的和最新的选择。
- 由于MathWorks提供的MATLAB函数似乎不强制执行严格的输入参数数据类型,这进一步表明,即使有可能这样做,也可能不是推荐的方法。
- MATLAB似乎将“错误处理”和“异常处理”视为两个不同的概念。例如,这里有两个指向MATLAB文档中心的链接,它们显示了MathWorks如何以不同方式考虑“错误处理”和“异常处理”: MathWorks文档中心有关错误处理的文章, MathWorks文档中心有关异常处理的文章。已经就此主题发布了相关的StackOverflow帖子,并且可以找到它 在这里(链接)。我联系了MathWorks并在该帖子中添加了有关此主题的一些新信息,因此如果您有兴趣,可以通过以下链接阅读更多内容。
您可能会发现编写这种代码很乏味或担心它会降低性能:
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
在你的命令窗口中)无论好坏。
Matlab提供了一个'inputParser',它允许检查输入。除此之外,你可以使用断言:
assert(islogical(yes_or_no),'logical input expected')
要确保输入参数的正确数量,请使用 narginchk
。
顺便说一下:看看像Matlab这样的一些函数 edit integral
并检查tmw如何处理这个问题。