我是一個很新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
此致敬禮 馬克
使用內置的分析器。它會一行一行地給你,所以你可以準確地看到時間花在哪裏。 – robince 2011-04-12 07:50:35
喜。據分析器,for循環應小於0.01秒。該FROMFILE數組的大小大約是700000x3,對於有問題的文件,所以我想這是緩慢的,由於從提取數據的3倍該數組..這可以改善?或者我會更好,以另一種方式導入數據? – 2011-04-12 08:19:45
我不確定你是否在正確的地方尋找。尋找紅線 - 這些花費更多時間(for循環定義行不應該花很長時間,因爲這只是對每次迭代的比較進行計時)。我認爲你可以通過k遍歷循環(在整個加載數組上取maxes + mins)。此外,如果您可以控制數據來自何處,請確保在加載時間不成問題的情況下其未壓縮(應從分析器中看到) – robince 2011-04-12 08:44:19