2011-04-12 88 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