4

sandbox이라는 최상위 함수 하나가 들어있는 MATLAB 파일이 있습니다. 이 함수는 차례로 내부적으로 @sum을 사용하고 다른 하나는 @prod을 내부적으로 사용한다는 점을 제외하고 기능과 매개 변수가 동일한 두 개의 중첩 함수 인 mysummyprod을 포함합니다. 내 목표는 mysummyprod 모두에서 사용하는 래퍼 함수를 ​​만들어 모든 유효성 검사 및 입력 구문 분석을 처리하는 것입니다. 이 함수는 applyFunc입니다.옵션 문자열 입력과 함께 MATLAB의 inputParser를 사용하려면 어떻게해야합니까? 설명서에 "유효성 검사 기능 사용"이라고 나와 있지만 그 방법이 확실하지 않습니다.

여기 까다로운 부분이 있습니다. mysummyprod는 두 가지 형태로 제공 :

  1. mysum(v) 반환 sum(v, 1).
  2. 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' 인수 (sp의 할당에서와 같이) 전혀 전달되지 않는 경우, 코드는 잘 작동하지만 내가 그것을 통과 할 경우,이 오류가 얻을 :

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'); 

어떤 도움을?

답변

4

validatestring은 유효성 검사를 통과하는지 여부를 나타내는 부울이 아닌 셀 인수 ({'imag',''})에서 일치하는 문자열을 반환합니다. (빈 문자열은 R2014a +에서 일치하기 때문에 실제로 단지 'imag') 입력 문자열 중 하나 'imag' 또는 '' 일치하지 않은 경우, validatestring으로, 또한

@(x) any(strcmp(x,{'imag', ''})) 

, 그것은 오류가 아닌 던질 것 대신, strcmpany를 사용 false를 반환하면 inputParser이 해당 오류를 반환 할 수 있습니다.

문제를 해결하는 또 다른 좋은 방법은, 선택적 문자열 입력 인수로 완전히 그래서 대신 'imag'applyFunc의 구문을 변경하려면 매개 변수 및 입력으로 검증 된 부울 'imag'Parameter-Value을 사용하는 것입니다.코멘트에 암로에 의해 제안

입력 정의 :

p.addParameter('imag', false, @(x)validateattributes(x, {'logical'}, {'scalar'})) 

사용법 :이 p.Result.imaglogical 스칼라 인 상태 코드의 나머지 부분을 단순화 할

mysum(x,'imag',true) 
mysum(x)    % default is equivalent to mysum(x,'imag',false) 

. 내가 제안 :

x = f(v) + p.Result.imag*1i; 
+3

+1 'strcmp'를 사용하면 문제가 해결됩니다. 필자는 개인적으로 "선택적 인수"를 좋아하지 않으며, 대신 이름 - 값 매개 변수 인수를 사용합니다.'p.addParameter ('imag', false, @ (x) validateattributes (x, { 'logical'}, { ' 스칼라 '}))'. 그러면'p.Result.imag'는 true 또는 false 중 하나입니다. – Amro

+0

나중에 코드에서 비교를 정리하는 좋은 방법입니다. 논리 값을 가진 param-value 인수 일 수도 있습니다. – chappjc

+0

@chappjc 도움을 주셔서 감사합니다. 선택적 인수 대신 이름 - 값 쌍을 사용하는 것이 좋을 것이므로 새 코드에이 값을 사용할 것입니다. 불행하게도 현재 작동중인 코드는 변경이 허용되지 않는 API의 기존 항목입니다. –

1

문제는 inputParser하지, 난 문제가 validatestring으로 생각합니다.

1) 먼저이 빈 문자열에 일치하지 않습니다 성공적으로 일치하는 경우

>> x = '' 
x = 
    '' 

>> validatestring(x, {'imag',''}) 
Expected input to match one of these strings: 

imag, 

The input did not match any of the valid strings. 
Caused by: 
    Error using validatestring>checkString (line 85) 
    Expected input to be a row vector. 

2) 둘째, 그것이 올바른 선택 중 하나에서 해결 된 문자열을 (반환) 대신 참/거짓의 . inputParser은 유효성 검사 함수가 부울 값을 반환하거나 오류 발생시 오류를 throw해야합니다.

+0

R2014a 시험판 출시 노트를 보셨습니까? 빈 문자열이 이제 일치하는 것 같습니다. MathWorks가 SO를 읽는 것과 같습니다. :) – chappjc

+0

나는 시험판을 보지 못했지만 좋은 소식입니다. 우리에게 알려 주셔서 감사합니다 .. 호기심에서, 시험판에 큰 변화가 있습니까? HG2 그래픽은 아마도? – Amro

+0

HG2가 기본값이 아닙니다. 커맨드 라인에서 위로 키를 친 때 새로운 성가신 새로운 팝업 명령어 역사가 있습니다. MEX 설정은 이제는 더 쉬워졌지만 별도의 C 및 C++ 구성 (전 대량 혼란이 있음)이 있습니다. 'flipud','fliplr', 그리고'rot90' 명령은 이제 다차원 배열과 함께 작동하지만 구문은 변경되었습니다. 'issymmetric','isdiag' 등과 같은 새로운 테스트 함수가 있습니다. – chappjc