MATLAB中的大型矩阵

时间:2018-11-15 15:46:59

标签: matlab for-loop signal-processing

下面我在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行?

干杯, 大子

1 个答案:

答案 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_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位类型(例如double),则大约为1GB。缺点是,文件将不得不读取多次。余额从内存消耗转移到文件I / O。