Большие матрицы в MATLAB - PullRequest
       13

Большие матрицы в MATLAB

0 голосов
/ 15 ноября 2018

После моего предыдущего вопроса в этой записи :

Я пытаюсь построить матрицу из 128 строк с N столбцом (до многих миллионов).Единственная цель этой матрицы - вычислить среднее значение или медиану всех столбцов 128 строк и сохранить их как вектор (то же количество столбцов, что и мои данные).

Размер моих файлов данных сильно варьируетсяи с меньшими, я смог выполнить это без каких-либо проблем, используя код из предыдущего поста (см. выше).Но, конечно, если я имею дело с большими наборами данных, у меня заканчивается память.Имейте в виду, что ошибка заключается в объединении 128 строк в новую матрицу.

РЕДАКТИРОВАТЬ код, используемый для объединения данных в файлах, следующий:

for k = TTs;   %TTs to plot
    cd (strcat('TT',num2str(k)));   %TT folder

        for w = 1:4;
            load(strcat('TT',num2str(k),'ch',num2str(w),'.mat'));
            allChs1(4*(k-1)+w,:) = data(1,:);   %concatenate into one matrix
        end

    cd ..
end

У меня естьрассматривалось усреднение 128 строк (по столбцам за столбцом) и последовательное сохранение этого значения, но безуспешно при этом ...

Есть идеи, как мне это реализовать?И может ли быть лучший способ получить среднее значение 128 строк для столбца за столбцом?

Cheers, Oiko

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете постепенно вычислять среднее значение, чтобы у вас был только один набор данных и среднее значение в памяти:

среднее значение [n] = значение [n] / n + среднее значение [n-1] (n-1) / n *

avg_vector=0; % It will be changed to a vector at first iteration
for k = TTs;   %TTs to plot
    folder=['TT',num2str(k)];   %TT folder

        for w = 1:4;
            file = ['TT' num2str(k) 'ch' num2str(w) '.mat'];
            count = 4*(k-1)+w;
            load(fullfile(folder,file));
            avg_vector = (1/count) * data(1,:) + ((count-1)/count) * avg_vector;
        end
end

При условии, что число столбцов не очень велико (в этом случае некоторая точность может быть потеряна из-за ошибок округления), это дастсредний.Единственные большие векторы в памяти: avg_vector и data

Для медианы это сложнее, так как нет инкрементальной формулы.Возможно, вам придется добавить еще один цикл для некоторого подмножества 1: N и сделать выборку.

filename=@(k,w) fullfile(['TT',num2str(k)],['TT' num2str(k) 'ch' num2str(w) '.mat']);
load(filename(1,1));
N=size(data,2);
median_all = zeros(1,N);

stride = 1e6;

for nn=1:stride:N
    rng = nn:min(N,nn+stride-1);
    MAT=zeros(128,length(rng));
    for k=TTs
        for w=1:4
            load(filename(k,w));
            MAT(4*(k-1)+w,:)=data(1,rng);
        end
    end
    median_all(1,rng) = median(MAT,1);
    clear MAT
end

В матричном MAT будет не более 128 миллионов значений, поэтому около 1 ГБ, если data равно 64-битный тип (например, двойной).Недостатком является то, что файл придется читать несколько раз.Баланс смещен с потребления памяти на файловый ввод / вывод.

...