这就是我使用的。您可以使用采用标量大小参数的稍微简洁的形式。
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(end+1)”; "end" 仅适用于预先分配的值。
这是 Matlab 的一个棘手领域。在 subsasgn 和类似的类型系统中工作会产生很多细微的错误,包括段错误。这样做会让您为用户定义的对象获得更“完整”的行为。但这涉及工作和脆弱性,您最好坚持使用“repmat(class, 0)”或“empty()”。