慢阵列操作

时间:2011-04-12 07:37:52

标签: arrays performance matlab

我是一个非常新的MatLab程序员,所以这可能很简单......:)

我正在尝试生成一个脚本,该脚本能够以任意顺序将任意数量的XYZ文件读入数组,并根据文件中给出的X和Y坐标将它们排列在数组中.. 我的尝试是使用Load将文件放入数组中,然后读取数组,并按照说明使用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

祝你好运 标记

1 个答案:

答案 0 :(得分: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