我有一个 MATLAB 文件,其中包含一个名为sandbox
. 该函数又包含两个嵌套函数mysum
和myprod
,它们在功能和允许的参数上是相同的,除了一个@sum
在内部使用而另一个在@prod
内部使用。我的目标是创建一个在两者中都使用的包装函数,mysum
它myprod
负责所有的验证和输入解析。这个函数被称为applyFunc
。
这就是棘手的地方。mysum
有myprod
两种形式:
mysum(v)
返回sum(v, 1)
。mysum(v, 'imag')
返回sum(v, 1) + 1i
任何其他输入组合都应引发错误。
我无法inputParser
解析这些不同的输入组合,特别是可选的字符串输入。这是代码:
function sandbox()
%% Data
v = [1 4; 3 3];
%% Calculations
s = mysum(v);
si = mysum(v, 'imag');
p = myprod(v);
pi = myprod(v, 'imag');
%% Accuracy tests
assert(isequal(s, [4 7]))
assert(isequal(si, [4+1i 7+1i]))
assert(isequal(p, [3 12]))
assert(isequal(pi, [3+1i 12+1i]))
function x = mysum(varargin)
x = applyFunc(@sum, varargin{:});
end
function x = myprod(varargin)
x = applyFunc(@prod, varargin{:});
end
end
function x = applyFunc(func, varargin)
p = inputParser();
p.addRequired('func', @(x) validateattributes(x, {'function_handle'}, {'scalar'}));
p.addRequired('v', @(x) validateattributes(x, {'double'}, {}, 'applyFunc:msg', 'v'));
p.addOptional('imag', '', @(x) validatestring(x, {'imag', ''})); % THIS LINE IS THE PROBLEM
p.parse(func, varargin{:});
f = p.Results.func;
v = p.Results.v;
strflag = p.Results.imag;
x = f(v);
if ~isempty(strflag)
validatestring(strflag, {'imag'});
x = x + 1i;
end
end
导致问题的行是这一行(如上面的代码中标记的那样):
p.addOptional('imag', '', @(x) validatestring(x, {'imag', ''}));
inputParser 的文档说:
对于可选字符串输入,请指定验证函数。如果没有验证函数,输入解析器会将有效的字符串输入解释为无效的参数名称并引发错误。
不幸的是,我不知道如何做到这一点。我缺少什么简单的东西还是什么?如果'imag'
根本没有传递参数(如s
and的赋值p
),代码可以正常工作,但如果我传递它,我会收到此错误:
Error using sandbox>applyFunc (line 32)
The value of 'imag' is invalid. It must satisfy the function:
@(x)validatestring(x,{'imag',''}).
Error in sandbox/mysum (line 18)
x = applyFunc(@sum, varargin{:});
Error in sandbox (line 7)
si = mysum(v, 'imag');
有什么帮助吗?