sandbox
이라는 최상위 함수 하나가 들어있는 MATLAB 파일이 있습니다. 이 함수는 차례로 내부적으로 @sum
을 사용하고 다른 하나는 @prod
을 내부적으로 사용한다는 점을 제외하고 기능과 매개 변수가 동일한 두 개의 중첩 함수 인 mysum
과 myprod
을 포함합니다. 내 목표는 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'는 true 또는 false 중 하나입니다. – Amro
나중에 코드에서 비교를 정리하는 좋은 방법입니다. 논리 값을 가진 param-value 인수 일 수도 있습니다. – chappjc
@chappjc 도움을 주셔서 감사합니다. 선택적 인수 대신 이름 - 값 쌍을 사용하는 것이 좋을 것이므로 새 코드에이 값을 사용할 것입니다. 불행하게도 현재 작동중인 코드는 변경이 허용되지 않는 API의 기존 항목입니다. –