首页 > 解决方案 > 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

标签: matlabfor-loopsignal-processing

解决方案


您可以增量计算平均值,这样您就只有一个数据集和内存中的平均值:

平均值[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_vectordata

对于中位数,这更复杂,因为没有增量公式。您可能必须在 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。


推荐阅读