下面我在this post中提出的问题:
我正在尝试用N列(最多数百万)构建128行矩阵。此矩阵的唯一目的是按列计算所有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行?
干杯, 大子
答案 0 :(得分:2)
您可以递增地计算平均值,这样就只有一个数据集和平均值在内存中:
平均值[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中最多有1.28亿个值,所以如果data
是64位类型(例如double),则大约为1GB。缺点是,文件将不得不读取多次。余额从内存消耗转移到文件I / O。