Медленные операции с массивами - PullRequest
2 голосов
/ 12 апреля 2011

Я совершенно новый программист 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

Как видно, я добавил тик-ток, и время одной операции составило 3.36сек!

Любое предложение о том, почему это так медленно, и как улучшить скорость .. Мне нужно заказать 2x6 000 000 строк, и я не могу удосужиться ждать 466 дней ..: D

С наилучшими пожеланиями Mark

1 Ответ

0 голосов
/ 07 июля 2011

Рассматривали ли вы использование разреженной матрицы?

Разреженная матрица в 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.

Больше информации здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...