我正在处理大数组(大约6x4000万),我的代码显示了很大的瓶颈。我在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中清除未使用的对象(如1中的未使用对象)会有任何影响吗?(看起来不像那样)
我是否监督过任何其他重要的机制或经验规则,或者整个事情是不是太过了,应该是这样发生的?
发布于 2014-06-03 11:52:09
当使用subsref时,matlab会复制子引用的元素。对于大型数组来说,这可能是代价高昂的。通常情况下,将像这样的矢量进行连锁化会更快
res = [a,b,c];对于上面编写的当前代码来说,这是不可能的,但是如果可以对代码进行修改以使其工作,它可能会节省一些时间。
编辑用于多维数组,您需要使用cat
CompImage = cat(dim,Subimage,Subimage,PCImage);其中,本例的dim为3。
https://stackoverflow.com/questions/24011917
复制相似问题