我有一個MATLAB文件,其中包含一個頂級函數。該函數又包含兩個嵌套函數,即mysum
和myprod
,它們的功能和參數相同,除了一個在內部使用@sum
,而另一個在內部使用@prod
。我的目標是創建一個包裝函數,用於處理mysum
和myprod
中的所有驗證和輸入解析。這個功能被稱爲applyFunc
。如何在可選字符串輸入中使用MATLAB的inputParser?該文件說「使用驗證功能」,但目前還不清楚如何做到這一點
這裏是棘手的地方。 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文檔說:
For optional string inputs, specify a validation function. Without a validation function, the input parser interprets valid string inputs as invalid parameter names and throws an error.
不幸的是,我不知道如何做到這一點。有什麼簡單的我失蹤或什麼?如果'imag'
說法是沒有(如在s
和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');
任何幫助嗎?
+1使用'strcmp'解決了這個問題。我個人不喜歡「可選參數」,我寧願使用名稱值參數參數:'p.addParameter('imag',false,@(x)validateattributes(x,{'logical'},{'標量'}))'。那麼'p.Result.imag'可能是真或假。 – Amro
這是在代碼中稍後清理比較的好方法。它可能是具有邏輯值的參數值參數。 – chappjc
@chappjc感謝您的幫助。我真的很喜歡使用名稱 - 值對而不是可選參數,所以我可能會將它用於新代碼。不幸的是,我現在正在使用的代碼是不允許更改的API的遺留問題。 –