Вы можете постепенно вычислять среднее значение, чтобы у вас был только один набор данных и среднее значение в памяти:
среднее значение [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-битный тип (например, двойной).Недостатком является то, что файл придется читать несколько раз.Баланс смещен с потребления памяти на файловый ввод / вывод.