2011-04-12 85 views
2

我是一个很新MatLab的程序员,所以这可能是一个容易.. :)慢数组操作

我试图生成一个脚本,将能够读取任何数量的XYZ-的文件,以任意顺序,进入阵列,并根据X数组中安排他们和Y坐标的文件中给出.. 我尝试使用加载的文件进入一个阵列,并且在这之后,通读数组和,作为解释,使用X和Y坐标作为新阵列的位置..

我已经试过预置数组的大小,也我是从X和Y减去值减少数组的大小(fullArray)

%# Script for extraction of XYZ-data from DSM/DTM xyz files 

%# Define folders and filter 
DSMfolder='/share/CFDwork/site/OFSites/MABH/DSM/*.xyz'; 
DTMfolder='/share/CFDwork/site/OFSites/MABH/DTM/*.xyz'; 

%# Define minimumvalues, to reduce arrays.. Please leave some slack, for the 
%# reduction-algorithm.. 
borderX=100000; 
borderY=210000; 

%% Expected array-size 
expSizeX=20000; 
expSizeY=20000; 



%# Program starts.. Please do not edit below this line! 
files=ls(DSMfolder); 

clear fullArray 
fullArray=zeros(expSizeX,expSizeY); 

minX=999999999; 
minY=999999999; 
maxX=0; 
maxY=0; 

disp('Reading DSM files'); 
[thisFile,remaining]=strtok(files); 
while (~isempty(thisFile)) 
    disp(['Reading: ' thisFile]); 
    clear fromFile; 
    fromFile=load(thisFile); 
    for k=1:size(fromFile,1) 
     tic 
     fullArray(fromFile(k,1)-borderX,fromFile(k,2)-borderY)=fromFile(k,3); 
     disp([k size(fromFile,1)]); 
     if (fromFile(k,1)<minX) 
      minX=fromFile(k,1); 
     end 
     if (fromFile(k,2)<minY) 
      minY=fromFile(k,2); 
     end 
     if (fromFile(k,1)>maxX) 
      maxX=fromFile(k,1); 
     end 
     if (fromFile(k,2)>maxY) 
      maxY=fromFile(k,2); 
     end 
     toc 
    end 
    [thisFile,remaining]=strtok(remaining); 
end 

可以看出,我添加了一个tic-toc,一次操作时间为3.36secs!

上的任何建议,为什么会这么慢,如何提高速度。我需要订购2x6,000,000行了,我也懒得等待466天..:d

此致敬礼 马克

+2

使用内置的分析器。它会一行一行地给你,所以你可以准确地看到时间花在哪里。 – robince 2011-04-12 07:50:35

+0

喜。据分析器,for循环应小于0.01秒。该FROMFILE数组的大小大约是700000x3,对于有问题的文件,所以我想这是缓慢的,由于从提取数据的3倍该数组..这可以改善?或者我会更好,以另一种方式导入数据? – 2011-04-12 08:19:45

+0

我不确定你是否在正确的地方寻找。寻找红线 - 这些花费更多时间(for循环定义行不应该花很长时间,因为这只是对每次迭代的比较进行计时)。我认为你可以通过k遍历循环(在整个加载数组上取maxes + mins)。此外,如果您可以控制数据来自何处,请确保在加载时间不成问题的情况下其未压缩(应从分析器中看到) – robince 2011-04-12 08:44:19

回答

0

你有没有考虑过使用稀疏矩阵?

matlab中的稀疏矩阵由一系列值及其在矩阵中的位置定义 - 顺便说一句,这完全符合您的输入文件。

虽然这种表示通常用于真正稀疏的矩阵(即它们的大部分值为零),但在您的情况下,似乎使用稀疏函数加载矩阵会更快,即使它是不真正稀疏。

由于数据以这样的方式组织(每个数据点的位置),我的猜测是它是稀疏的反正。

创建一个稀疏矩阵的功能需要如此,而不是位置,因为列的for循环您的代码将是这个样子(这部分替换整个for循环):

minX = min(fromFile(:,1); 
maxX = max(fromFile(:,1); 
minY = min(fromFile(:,2); 
minY = max(fromFile(:,2); 
S = sparse(fromFile(:,1) - borderX, fromFile(:,2) - borderY, fromFile(:,3)); 

注意,其他我做的改变是直接从矩阵计算最小/最大值 - 这比通过for循环要快得多,因为对向量和矩阵的操作释放了matlab的真正功率:)

您可以执行所有排序对稀疏矩阵进行操作,但是如果您想将其转换为常规矩阵,则可以使用matlab full函数。

更多信息herethere