Вот что я использую.Вы можете использовать более краткую форму, которая принимает аргумент скалярного размера.
r = repmat(MyClass, 0);
Обратите внимание, что вы не объявляете переменную типом;это просто значение в переменной, имеющей тип.
Это будет работать как со старым стилем, так и с новыми классами MCOS.Если вы используете все новые классы стилей, gnovice "empty ()" звучит как хорошая идея.
Если вы чувствуете себя продвинутым, есть еще один вариант, который я включаю для полноты.
Вы можете также обработать это в subsasgn для ваших объектов, по крайней мере, для класса старой школы Matlab.Если вы выполняете индексированное присваивание в унифицированную переменную с определенным пользователем объектом в RHS («правая сторона»), вызывается subsagn для этого класса, а LHS появляется как [] (пустой двойник).Если у вас есть специальная форма конструктора, которая позволяет вам создавать пустой объект без вызова repmat для объекта, вы можете поддерживать это, чтобы пользователям не приходилось предварительно распределять свои переменные с объектами вашего класса.
В вашем subsasgn:
function obj = subsasgn(obj, S, B)
...
s = S(1);
...
switch s.type
case '()'
% Handle dispatch on LHS autovivification
if isnumeric(obj) && isa(B, mfilename('class'))
% Must use special ctor to preallocate
obj = feval(class(B), mxdims(size(B)));
end
Затем в вашем конструкторе создайте форму вызова бэкдора для создания пустот путем благословения предварительно отформатированных структур.
function MyClass(varargin) %constructor
SuperClasses = { }; % if you inherit, fill this in
if nargin == 1 && isa(varargin{1}, 'mxdims')
% special backdoor to support preallocation without repmat
s = repmat(DataStructure, msize(varargin{1})); % built-in repmat called on plain struct
out = class(s, mfilename, SuperClasses{:});
return;
end
...
Класс @mxdims - это специальный класс, который вы будете использовать.нужно создать, который содержит вектор размера и служит маркером для вызова этой бэкдор формы.Метод msize () возвращает вектор размера, который он представляет.
Если вы определили MyClass, чтобы он поддерживал это, то вы можете просто сделать «s (1) = MyClass» без предварительного выделения s.Вы не можете сделать "s (конец + 1)", хотя;«end» работает только с предварительно выделенными значениями.
Это сложная область Matlab, с которой нужно работать. Работа в subsasgn и подобной системе типов может привести к множеству незначительных ошибок, в том числе к ошибкам сегмента.Делая это таким образом, вы получите более «полное» поведение для ваших пользовательских объектов.Но это включает в себя работу и хрупкость, и вам, вероятно, лучше придерживаться «repmat ( class , 0)» или «empty ()».