matlab - MATLAB 中的大矩阵
问题描述
在我之前在这篇文章中提出的问题之后:
我正在尝试构建一个包含 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 行的平均值?
干杯, Oiko
解决方案
您可以增量计算平均值,这样您就只有一个数据集和内存中的平均值:
平均值[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 位类型(例如双精度),大约有 1GB。缺点是,必须多次读取文件。平衡从内存消耗转移到文件 I/O。
推荐阅读
- angular - 识别组件发射输出属性
- android - Android Studio 3.4.1,Kotlin“未解决的参考:mutableListOf”
- css - Angular Material mat-icon-button,在 Ionic 中垂直对齐文本
- html - 如何在标题 div 下移动我的视差背景图像
- c# - 提取安全组成员时服务器上没有此类对象
- angular - Angular 使用中的 Merge Map 运算符
- azure - ProcessEventsAsync 中的延迟检查点
- mongodb - 复制处于活动状态时无法删除“本地”数据库
- javascript - 使用 Selenium 和 Node.js 进行自动化测试
- azure - 如何删除数据工厂中的链接服务?