我是一个很新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