我正在使用大数组(大约6x40万)并且我的代码显示出很大的瓶颈。我在MatLab中经验丰富,但对内部过程(如内存等)知之甚少。
我的代码如下所示(只是必需品,当然所有变量都已初始化,特别是循环中的数组,我只是不想用代码轰炸你们所有人):
首先我读了这个文件,
disp('Point cloud import and subsampling')
tic
fid=fopen(strcat(Name,'.dat'));
C=textscan(fid, '%d%d%f%f%f%d'); %<= Big!
fclose(fid);
然后从内容中创建数组
y=C{1}(1:Subsampling:end)/Subsampling;
x=C{2}(1:Subsampling:end)/Subsampling;
%... and so on for the other rows
clear C %No one wants 400+ millon doubles just lying around.
清除单元格数组( 1 ),并使用新值创建一些图像和数组
for i=1:length(x)
PCImage(y(i)+SubSize(1)-maxy+1,x(i)+1-minx)=Reflectanse(i);
PixelCoordinates(y(i)+SubSize(1)-maxy+1,x(i)+1-minx,:)=Coordinates(i,:);
end
toc
在此之前,所有内容都或多或少地运行,但随后我操纵了一些数组
disp('Overlap alignment')
tic
PCImage=PCImage(:,[1:maxx/2-Overlap,maxx/2:end-Overlap]); %-30 overlap?
PixelCoordinates=PixelCoordinates(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);
Sphere=Sphere(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);
toc
这是一个很大的瓶颈,但下一步会变得更糟
disp('Planar view and point cloud matching')
tic
CompImage=zeros(max(SubSize(1),PCSize(1)),max(SubSize(2),PCSize(2)),3);
CompImage(1:SubSize(1),1:SubSize(2),2)=Subimage; %ExportImage Cyan
CompImage(1:SubSize(1),1:SubSize(2),3)=Subimage;
CompImage(1:PCSize(1),1:PCSize(2),1)=PCImage; %PointCloudImage Red
toc
输出
点云导入和子采样
经过的时间是181.157182秒。
重叠对齐
经过的时间是408.750932秒。
平面视图和点云匹配
经过的时间是719.383807秒。
我的问题是:清除 1 中C
之类的未使用对象有效吗? (看起来不像那样)
我是否监督任何其他重要的机制或经验法则,或者整个事情是否过多而且应该像这样发生?
答案 0 :(得分:2)
当使用subsref
时,matlab会复制子参考元素。对于大型阵列,这可能是昂贵的。通常它会更快地连接像
res = [a,b,c];
使用上面编写的当前代码是不可能的,但是如果可以修改代码以使其工作,则可以节省一些时间。
修改强>
对于多维数组,您需要使用cat
CompImage = cat(dim,Subimage,Subimage,PCImage);
此示例中dim
为3。