通过下采样将数据点减半

时间:2013-10-23 22:30:21

标签: matlab matrix

假设我有一个6x5矩阵(我的实际数据更大)

A B C D E

1 5 7 2 3

2 1 9 8 5

3 1 2 3 1

4 1 3 4 2

5 2 9 0 1

6 5 3 4 3

我必须在x轴上绘制A,在y轴绘制B,C,D。如果我想将数据点减少一半(通过平均每对相邻的数据点),我该怎么做?如果我想通过平均每五(或n)个点来进一步减少积分怎么办?

我查看了MATLAB帮助文档,但我仍然感到困惑

我得到了我需要的东西,感谢投入的人,这真的有帮助

3 个答案:

答案 0 :(得分:4)

你去了:

M = [1 5 7 2 3
     2 1 9 8 5
     3 1 2 3 1
     4 1 3 4 2
     5 2 9 0 1
     6 5 3 4 3]; % data

>>result = (M(1:2:end-1,:) + M(2:2:end,:))/2;

result =

1.5000    3.0000    8.0000    5.0000    4.0000
3.5000    1.0000    2.5000    3.5000    1.5000
5.5000    3.5000    6.0000    2.0000    2.0000

答案 1 :(得分:3)

偶数行方案很简单,使用mean来完成工作:

>> M = magic(4)
 M =
     16     2     3    13
      5    11    10     8
      9     7     6    12
      4    14    15     1
>> reshape(mean(reshape(M,2,[]),1),[],size(M,2))
ans =
   10.5000    6.5000    6.5000   10.5000
    6.5000   10.5000   10.5000    6.5000

对于奇数行方案,假设您要保留最后一行。这是一个一般偶数/奇数解决方案

>> M = magic(5) % 5 rows!
M =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9
>> Mp = [M; repmat(M(end,:),mod(size(M,1),2),1)]; % replicate last row if odd
>> Mthin = reshape(mean(reshape(Mp,2,[]),1),[],size(Mp,2))
Mthin =
   20.0000   14.5000    4.0000   11.0000   15.5000
    7.0000    9.0000   16.0000   20.5000   12.5000
   11.0000   18.0000   25.0000    2.0000    9.0000

或者,如果您想在遇到奇数行时丢弃最后一行:

>> Mp = M(1:end-mod(size(M,1),2),:);
>> Mthin = reshape(mean(reshape(Mp,2,[]),1),[],size(Mp,2))
Mthin =
   20.0000   14.5000    4.0000   11.0000   15.5000
    7.0000    9.0000   16.0000   20.5000   12.5000

现在平均n,保留mod(size(M,1),n)最后一行的平均值:

n = 5;
M = rand(972,5); % or whatever
p = mod(size(M,1),n);
r = repmat(mean(M(end-p+1:end,:),1),(p>0)*(n-p),1);
Mp = [M; r];
Mthin = reshape(mean(reshape(Mp,n,[]),1),[],size(Mp,2));

抛出最后mod(size(M,1),n)行:

Mp = M(1:end-mod(size(M,1),n),:);
Mthin = reshape(mean(reshape(Mp,n,[]),1),[],size(Mp,2));

答案 2 :(得分:2)

>>> A= magic(5) %some "random" data
A =

   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9

>>> B=(A(1:2:end-1,:)+A(2:2:end,:))/2
B =

   20.0000   14.5000    4.0000   11.0000   15.5000
    7.0000    9.0000   16.0000   20.5000   12.5000

取每对行的平均值,如果行数不均匀,则忽略最后一行。

一些通用解决方案:

%input data data
X=randi(30,30,5)
step=7
%extend matrix, until size matches step (could be done faster using repmat)
while(mod(size(X,1),step)~=0)
    X(end+1,:)=X(end,:)
end
%Split data into segments of size "step"
C=mat2cell(X,repmat(step,floor(size(X,1)/step),1),size(X,2))
%Average over each segment:
AVG=cell2mat(cellfun(@(x)(mean(x,1)),C,'UniformOutput',false))