MatLab瓶颈

时间:2014-06-03 09:43:37

标签: arrays matlab

我正在使用大数组(大约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之类的未使用对象有效吗? (看起来不像那样)

我是否监督任何其他重要的机制或经验法则,或者整个事情是否过多而且应该像这样发生?

1 个答案:

答案 0 :(得分:2)

当使用subsref时,matlab会复制子参考元素。对于大型阵列,这可能是昂贵的。通常它会更快地连接像

这样的载体
res = [a,b,c];

使用上面编写的当前代码是不可能的,但是如果可以修改代码以使其工作,则可以节省一些时间。

修改 对于多维数组,您需要使用cat

CompImage = cat(dim,Subimage,Subimage,PCImage);

此示例中dim为3。