gpt4 book ai didi

matlab - 在 Matlab 中验证两个相关输入的最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:33 28 4
gpt4 key购买 nike

我有一个关于在具有多个输入的 Matlab 函数中进行输入验证的最佳实践的问题。这有点哲学。我在论坛上四处张望,但没有看到对此进行全面讨论。我关心验证条件涉及两个或多个输入变量的情况。这是一个例子。

假设我编写了一个具有两个输入 a 和 b 的函数。我知道输入必须满足条件

a > 0b > 0

如果我想验证这些输入,我通常会编写这样的函数(仅用于说明目的,函数的作用并不重要):

% My function
function [result] = myLogSum(a,b)

% Create an input parser
p = inputParser;
% Add required inputs with validation
isPositive = @(x) all(x>0);
addRequired(p, 'a', isPositive);
addRequired(p, 'b', isPositive);
% Parse the inputs
parse(p,a,b);

% Calculate the log sum
result = log(a) + log(b);

end

但现在假设 a 和 b 是数组,我还需要检查它们是否相同大小:

all(size(a) == size(b)) == true

有没有办法用输入解析器处理这种情况?如果不是,处理这个问题的最佳方法是什么?

我可以想到四种解决方案,但我不知道哪个是最好的。

1) 我是否应该将 a 和 b 集中在 {a,b} 形式的单个输入元胞数组变量 sumInput 中,并为元胞编写自定义验证函数大批?很好,但我不知道像那样将输入集中在一起是否总是好的做法。在这里,能够编写 myLogSum(a,b) 而不是 myLogSum(sumInput) 似乎很自然。

2) 或者在这种情况下,我是否应该在函数中编写这部分输入验证,即修改上面的代码,如下所示:

% My function
function [result] = myLogSum(a,b)

% Create an input parser
p = inputParser;
% Add required inputs with validation
isPositive = @(x) all(x>0);
addRequired(p, 'a', isPositive);
addRequired(p, 'b', isPositive);
% Parse the inputs
parse(p,a,b);

% Check that the input arrays have the same size
if ~all(size(a)==size(b))
message = 'The arrays a and b must have the same size.';
error(message);
end

% Calculate the log sum
result = log(a) + log(b);

end

这也很好,但它使验证有点不均匀和不美观,因为现在我出于不同的原因以不同的方式对输入 a 和 b 进行了两次验证。

3) 我是否应该放弃输入解析器而只编写自己的验证函数,正如此处所建议的那样:

Best practice when validating input in MATLAB

但我非常喜欢输入解析器,因为它是一种管理选项的巧妙方式。

4) 当程序到达最后一行 result = log(a) + log(b) 并且数组大小不匹配时,我可以让 Matlab 自己处理错误。但不知何故,从长远来看,我觉得这是自找麻烦。

如果您有使用 Matlab 的经验,请告诉我您认为当两个输入相关时最稳健和最全面的验证策略是什么。

最佳答案

没有什么可以阻止您调用 parse 一次,然后添加新的输入并再次调用 parse - 此时您可以使用之前解析的值你的验证功能。 validateattributes 函数在这里对于构建具有多个条件的验证函数很有用。例如:

% My function
function [result] = myLogSum(a,b)

% Create an input parser
p = inputParser;
% Add required inputs with validation
addRequired(p, 'a', @(x) validateattributes(x, {'numeric'}, {'>', 0}));
% Check the first input was valid
p.parse(a);
addRequired(p, 'b', @(x) validateattributes(x, {'numeric'}, {'>', 0, 'size', size(a)}));
% Parse the inputs
p.parse(a,b);

% Calculate the log sum
result = log(a) + log(b);

end

validateattributes 还会为您生成合理的解释性错误消息:

>> myLogSum(30, 40)

ans =

7.0901

>> myLogSum([30 20], 40)
Error using myLogSum (line 12)
The value of 'b' is invalid. Expected input to be of size 1x2 when it is
actually size 1x1.

>> myLogSum([30 20], [40 1])

ans =

7.0901 2.9957

>> myLogSum([30 20], [40 -1])
Error using myLogSum (line 12)
The value of 'b' is invalid. Expected input to be an array with all of the
values > 0.

关于matlab - 在 Matlab 中验证两个相关输入的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829854/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com