Skip to content

Commit

Permalink
更新ArrayBuilder的逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
Silver-Fang committed Jun 18, 2021
1 parent 3908633 commit a44172e
Showing 1 changed file with 9 additions and 22 deletions.
31 changes: 9 additions & 22 deletions ArrayBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
%数组累加器
%将数据向内存中积累时,经常遇到需要不断累加数组的问题,MATLAB会提示预分配内存。但如果读取之前无法得知将会有多少项,预分配就会变成一个十分麻烦的动态任务。本类建立一个增长维度,在此维度上可以不断累加一个内置的数组。用户只需不断Append即可,无需考虑内存分配的问题,本类会自动进行优化的内存管理。
properties(Access=private)
Storage
Storage(:,1)cell
Capacity(1,1)uint32=0
Subs(1,:)cell
end
properties(SetAccess=private)
%当前在累加维度上的累加数
Expand All @@ -24,31 +23,19 @@
end
function Append(obj,New)
%输入参数:New,累加内容。所有累加内容在累加维度上尺寸可以不一致,但在其它维度上必须一致。
persistent Size
if isempty(Size)
Size=num2cell(size(New));
end
if obj.Stock==0
obj.Subs=repmat({':'},1,max(ndims(New),obj.BuildDimension));
obj.Stock=size(New,obj.BuildDimension);
obj.Stock=obj.Stock+1;
if obj.Capacity<obj.Stock
obj.Capacity=obj.Stock*2;
obj.Storage=cat(obj.BuildDimension,New,New);
else
NewStock=obj.Stock+size(New,obj.BuildDimension);
if NewStock>=obj.Capacity
obj.Capacity=NewStock*2;
Size{obj.BuildDimension}=obj.Capacity;
obj.Storage(Size{:})=New(1);
end
obj.Subs{obj.BuildDimension}=obj.Stock+1:NewStock;
obj.Storage(obj.Subs{:})=New;
obj.Stock=NewStock;
obj.Storage(obj.Capacity)={};
end
obj.Storage{obj.Stock}=New;
end
function Array=Harvest(obj)
%收获累加完毕的MATLAB数组。收获后可以释放本对象,也可以继续累加。
obj.Subs{obj.BuildDimension}=1:obj.Stock;
Array=obj.Storage(obj.Subs{:});
Array=cat(obj.BuildDimension,obj.Storage{1:obj.Stock});
end
function Clear(obj)
obj.Stock=0;
end
end
end

0 comments on commit a44172e

Please sign in to comment.