我想确保用户定义的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中进行严格的数据输入,但也许你们中的许多人都知道一些我无法找到的有用技巧,特性或语法。
答案 0 :(得分:6)
validateattributes
也可能适合您。例如,如果要强制yes_or_no是逻辑标量,可以尝试:
validateattributes(yes_or_no,{'logical'},{'scalar'})
否则可能是'非空'等属性。
答案 1 :(得分:6)
我得到了一些很好的回应,所以我不能只选择一个作为“已接受的答案”,而是总结一下到目前为止我从你们那里学到的东西:
inputParser
class validateattributes()
throw()
,error()
,assert()
等。)edit
后跟函数名来验证输入参数。要查看的两个建议函数是normpdf()
(来自统计工具箱)和integral()
。我发现有助于查看的其他一些功能包括dot()
和cross()
。其他想法:
inputParser
类是以最专业的方式验证输入参数的总体共识。在a related (but not duplicate) stackoverflow post上注意到,较新的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
)无论好坏。