MATLAB 中的大矩阵
Big matrices in MATLAB
根据我之前在 中的问题:
我正在尝试构建一个包含 N 列(最多数百万)的 128 行矩阵。该矩阵的唯一目的是按列计算所有 128 行的平均值或中值,并将其保存为向量(与我的数据相同的列数)。
我的数据文件的大小变化很大,对于较小的数据文件,我已经能够使用之前 post 中的代码(见上文)执行此操作而没有任何问题。但是当然,如果我正在处理更大的数据集,我 运行 内存不足。请记住,错误在于将 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 行的平均值?
干杯,
小子
您可以增量计算平均值,这样内存中只有一个数据集和平均值:
均值[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.
根据我之前在
我正在尝试构建一个包含 N 列(最多数百万)的 128 行矩阵。该矩阵的唯一目的是按列计算所有 128 行的平均值或中值,并将其保存为向量(与我的数据相同的列数)。
我的数据文件的大小变化很大,对于较小的数据文件,我已经能够使用之前 post 中的代码(见上文)执行此操作而没有任何问题。但是当然,如果我正在处理更大的数据集,我 运行 内存不足。请记住,错误在于将 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 行的平均值?
干杯, 小子
您可以增量计算平均值,这样内存中只有一个数据集和平均值:
均值[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.