Проверка класса свойства кривойfit.fitoptions - PullRequest
1 голос
/ 20 февраля 2020

TL; DR : Я хотел бы использовать подтверждение класса свойств для проверки fitoptions объектов, но MATLAB жалуется.


Рассмотрим следующие классы:

% SUPERCLASS:
classdef (Abstract) BaseModel
  % CWLvsT is an abstract parent class for different CWL(T) models.    

  properties (Abstract = true, Access = protected, Constant = true)
    MODEL   (1,1) string
    FITOPTS (1,1) % ???
  end  

end

% SUBCLASS:
classdef RationalFraction < BaseModel
  % This corresponds to a fit of type "rat11".
  properties (Access = protected, Constant = true)
    MODEL = "CWL(T) = (P1 * T + P2) / (T + Q1)";
    FITOPTS = fitoptions('rat11', ...
                  'Lower', [-1, -1E5, -1E4], ...
                  'Upper', [10, 5E5, 5E4], ...
                  'StartPoint', [4, 0, 0]);
  end
end

Я бы хотел, чтобы подклассы определяли какой-либо объект fitoptions (существует несколько типов) для свойства FITOPTS.

Попытка # 1 :

Первым делом я попытался создать пример объекта fitoptions (согласно определению в подклассе) и посмотреть, каков был его class. В результате я получил curvefit.nlsqoptions, поэтому я попытался поместить его вместо % ??? в суперкласс и создать экземпляр класса RationalFraction, но получил следующую ошибку:

Error defining property 'FITOPTS' of class 'BaseModel':
Class named 'curvefit.nlsqoptions' is undefined or does not support property validation. 
Попытка # 2 :

Я думал, что вышеприведенная ошибка является признаком того, что для fitoptions существует некоторый суперкласс, по которому я должен проверить объект, поэтому я попытался сделать metaclass(optsObj) на объекте примера, но получил пустой метаклассом . Прибегнув к ручному поиску, мне удалось найти хорошего кандидата, перебрав папку MATLAB\R2019b\toolbox\curvefit\curvefit\@curvefit - curvefit.basefitoptions, но это привело к аналогичной ошибке.

Попытка # 3 :

Я заметил, что fitoptions объекты находятся недалеко от простых struct объектов, поэтому я попытался FITOPTS (1,1) struct - что действительно привело к успешному созданию объекта. К сожалению, когда позже, обращаясь к этому полю FITOPTS при попытке вызвать fit, я получил следующую ошибку:

Error using fit>iParseOptionalArgs (line 949)
Algorithm options must be specified in a FITOPTIONS object or as property-value pairs.
Error in fit (line 113)
[useroptions, useroptargs, probparams] = iParseOptionalArgs( varargin{:} ); 

Что означает, что проверка свойства cast nlsqoptions объект в struct, теряющий «дополнительную информацию», в которой он содержал параметры соответствия. Хотя такое поведение является интересной находкой, оно не очень полезно в данном сценарии.

Мой вопрос :

Может кто-нибудь предложить способ выполнения проверки этого класса таким образом, чтобы FITOPTS заканчивался содержащий объект параметров подгонки?

Я работаю с R2019b.

1 Ответ

2 голосов
/ 20 февраля 2020

Последняя ошибка в вопросе относится к строке 949 в fit. Если мы посмотрим на этот файл, то увидим, что объект параметров соответствия «кандидат» передается в функцию с именем isfitoptions, которая проверяет, действителен ли он или нет.

Это намекает на другой механизм проверки входных данных - передавая их проверке функциям . Хотя эти функции предназначены для проверки значения , а не класса , нет никаких причин, по которым их нельзя использовать и для последнего. Таким образом, если функция MATLAB может быть вызвана пользователем, она может использоваться для проверки, а если нет, тот же тест (простой вызов isa) может быть реализован как метод в нашем собственном классе. , К счастью, эта функция доступна вне пакета / набора инструментов, и следующее приводит к желаемому результату:

  properties (Abstract = true, Access = protected, Constant = true)
    MODEL   (1,1) string
    FITOPTS (1,1) {isfitoptions}
  end
...