2016-12-30 6 views
1

Я использую функцию ввода парсера много, но теперь я столкнулся следующий вопрос:Input парсер: один параметр зависят от другого параметра

Я кодирование объекта, который вычисляет скорость его изменений временных рядов , т. е. один входной аргумент является матрицей удвоений (timeSeries). Второй входной параметр - это период времени, используемый для вычисления скорости изменения (lag). lag может быть вектором, когда будут вычислены разные скорости изменения. Третий входной вектор называется weightVector. weightVector будет использоваться для вычисления среднего значения всех изменений скорости и применения соответствующих весов к соответствующим результатам изменения скорости.

Теперь я всегда хотел бы определить некоторые значения по умолчанию при использовании парсера ввода. Я хотел бы определить weightVector как вектор с равномерным весом. Однако длина значения по умолчанию weightVector зависит от длины lag. Например, если lag = [1,2,3], то weightVector должно быть равно [1/3, 1/3, 1/3]. Как я должен кодировать такую ​​ситуацию? Мой текущий код для конструкторы выглядит следующим образом:

function obj = roc(timeSeries, varargin) 
    %% Input parser 

    % 1. Create input parser instance 
    p = inputParser; 

    % 2. Default values for input arguments 
    default_lag = 1; 
    default_weightVector = 1/length(lag); % This line is causing 
              % problems as LAG isn't 
              % defined, yet. 

    % 3. Validation of input arguments 
    valid_lag = {'vector', 'nonempty', 'integer', 'positive'}; 
    check_lag = @(x) validateattributes(x, {'numeric'}, valid_lag); 
    valid_weightVector = {'vector', 'nonempty'}; 
    check_weightVector = @(x) validateattributes(x, {'numeric'}, ... 
     valid_weightVector); 

    % 4. Add input arguments to input scheme 
    p.addRequired('timeSeries'); 
    p.addParamater('lag', default_lag, check_lag); 
    p.addParameter('weightVector', default_weightVector, check_weightVector); 

    % 5. Parse input arguments 
    parse(p, timeSeries, varargin{:}); 

    % 6. Assign results to variables 
    lag = p.Results.lag; 
    weightVector = p.Results.weightVector; 


    %% Main code 

end % Constructor 
+2

установить по умолчанию значения никогда не может быть (например, '' NaN' или «» ') и имеет условные после 'parse', что чеки чтобы увидеть, нужно ли генерировать 'weightVector' из проверенной переменной' lag'. – excaza

+0

Спасибо за подсказку. Это сработало для меня ... – Andi

ответ

0
function obj = roc(timeSeries, varargin) 
    %% Input parser 

    % 1. Create input parser instance 
    p = inputParser; 

    % 2. Default values for input arguments 
    default_lag = 1; 
    default_weightVector = 1; 

    % 3. Validation of input arguments 
    valid_lag = {'vector', 'nonempty', 'integer', 'positive'}; 
    check_lag = @(x) validateattributes(x, {'numeric'}, valid_lag); 

    % 4. Add input arguments to input scheme 
    p.addRequired('timeSeries'); 
    p.addParameter('lag', default_lag, check_lag); 
    p.addParameter('weightVector', default_weightVector); 

    % 5. Parse input arguments 
    parse(p, timeSeries, varargin{:}); 

    % 6. Assign results to variables 
    lag = p.Results.lag; 

    if check_weightVector(p.Results.weightVector, lag) == true 
     weightVector = p.Results.weightVector; 
    end 

    function vout = check_weightVector(weightVector, lag) % validation function 
     if length(lag) ~= length(weightVector) 
      error('lengthWeightVector:WrongNumberOfElements', 'The number of elements in "weightVector" must correspond to the number of elements in "lag"'); 
     elseif sum(weightVector) ~= 1 
      error('sumWeightVector:SumNotEqualToOne', 'The sum of elements in "weightVector" must equal 1'); 
     end 

     vout = true; 
    end 


    %% Main code 
end 
Смежные вопросы