使用Matlab

时间:2015-12-15 15:15:02

标签: matlab sequence average rows skip

我有一个13867 X 2元素的数组,存储在名为“data”的变量中。所以,我想在Matlab中做以下几点:

  • 平均值(第1行 - >第21行);即取前21个元素的平均值
  • 平均值(第22行 - >第43行);即取下22个元素的平均值
  • 平均值(第44行 - >第64行);即取下一个21个元素的平均值
  • 平均值(第65行 - >第86行);即取下两个元素的平均值
  • 重复这个过程直到矩阵结束,这样我们就可以得到第13847行到第13876行的最后21个元素的平均值。我想要第1列和第2列中元素的平均值。我已经设法了在Excel中执行此操作,但这是一项繁琐的任务(必须首先为行创建索引)。我想最后我们会得到645的平均值。

2 个答案:

答案 0 :(得分:1)

这样做的关键是插入NaN行以使较短的块(21行)与较长的块(22行)相同。使用Matlab FileExchange中的insertrows函数

非常简单
n = 21;
m = 22;

dataPad = insertrows(data, nan(1,size(data,2)), n:(n+m):size(data,1));

之后,第22行将是[NaN, NaN],第66行将是[NaN, NaN],依此类推。现在很容易计算平均值。只需重新整形此矩阵,以便所有应该平均的值都在同一列上。最后,使用nanmean函数(只是忽略NaN的平均函数)来获得结果。

我不是100%清楚,结果应该是645x2还是645x1,即是否也要对行进行平均。以下两种方式都是相应的reshape

1。对行进行平均处理:

dataPadRearr = reshape(dataPad.',m*size(data,2),[]);
result = nanmean(dataPadRearr,1);

2。只留下行:

dataPadRearr = reshape(dataPad,m,[],size(data,2));
result = squeeze(nanmean(dataPadRearr,1));

请注意,在这里,您需要一个最终squeeze,因为nanmean的结果将是1x645x2,这不太实用。 squeeze只会移除此单例维度。

答案 1 :(得分:1)

这是使用NaNs进行填充,重新整形和连接的一种解决方法 -

%// Input
A = rand(13867,2);

%// Two stepsizes
m = 21;
n = 22;

%// Combined stepsize
N = m+n;

%// Pad with NaNs to simplify reshaping & finding averages with nanmean
Apad = cat(1,A,nan(N*ceil(numel(A)/(2*N)) - numel(A)/2,2));

%// Reshape into a 3D array with Combined stepsize number of rows
B = reshape(Apad,N,numel(Apad)/(2*N),[]);

%// Index into first m rows and get nan ignored averages row-wise. 
%// Reshape into rows x 2 sized array
C = reshape(cat(1,nanmean(B(1:m,:,:),1),nanmean(B(m+1:end,:,:),1)),[],2);

%// Ignore NaNs and thus have the final output
out = reshape(C(~isnan(C)),[],2);

验证输出

前五行 -

>> out(1:4,:)
ans =
      0.55694      0.55289
      0.49942      0.53502
      0.57768      0.40828
       0.6347      0.45194

>> mean(A(1:21,:),1)
ans =
      0.55694      0.55289
>> mean(A(22:43,:),1)
ans =
      0.49942      0.53502
>> mean(A(44:64,:),1)
ans =
      0.57768      0.40828
>> mean(A(65:86,:),1)
ans =
       0.6347      0.45194

最后一行 -

>> out(end,:)
ans =
      0.44631      0.59432
>> mean(A(13847:13867,:),1)
ans =
      0.44631      0.59432

借助玩具示例解释

使用的样本 -

%// Input
A = rand(17,2)

%// Two stepsizes
m = 3;
n = 4;

1]输入:

A =
      0.64775      0.30635
      0.45092      0.50851
      0.54701      0.51077
      0.29632      0.81763
      0.74469      0.79483
      0.18896      0.64432
      0.68678      0.37861
      0.18351      0.81158
      0.36848      0.53283
      0.62562      0.35073
      0.78023        0.939
     0.081126      0.87594
      0.92939      0.55016
      0.77571      0.62248
      0.48679      0.58704
      0.43586      0.20774
      0.44678      0.30125

2]结合步长:

N =
     7

3]填充NaN填充行,使得行数是N的倍数 -

Apad =
      0.64775      0.30635
      0.45092      0.50851
      0.54701      0.51077
      0.29632      0.81763
      0.74469      0.79483
      0.18896      0.64432
      0.68678      0.37861
      0.18351      0.81158
      0.36848      0.53283
      0.62562      0.35073
      0.78023        0.939
     0.081126      0.87594
      0.92939      0.55016
      0.77571      0.62248
      0.48679      0.58704
      0.43586      0.20774
      0.44678      0.30125
          NaN          NaN
          NaN          NaN
          NaN          NaN
          NaN          NaN

4]这部分可能有点棘手。考虑将Apad中的每个列制作成2D数组,这样我们每列就会有N个元素,因为这里的目的是在将每个列进一步切割成两个子组之后获得每列的平均值。前三行并从这样的3D阵列中休息四行。因此,如果Apad有2行,我们会有一个包含两个3D切片的3D数组,这样第一个3D切片就会成为Apad中第一列的重新整形版本,即Apad(:,1) 。类似地,第二个3D切片对应于Apad中的第二列。因此,ressultant 3D数组将是 -

B(:,:,1) =
      0.64775      0.18351      0.48679
      0.45092      0.36848      0.43586
      0.54701      0.62562      0.44678
      0.29632      0.78023          NaN
      0.74469     0.081126          NaN
      0.18896      0.92939          NaN
      0.68678      0.77571          NaN
B(:,:,2) =
      0.30635      0.81158      0.58704
      0.50851      0.53283      0.20774
      0.51077      0.35073      0.30125
      0.81763        0.939          NaN
      0.79483      0.87594          NaN
      0.64432      0.55016          NaN
      0.37861      0.62248          NaN

5]查找每列的平均值/平均值nanmean(..,1)忽略NaNs -

>> nanmean(B(1:m,:,:),1)
ans(:,:,1) =
      0.54856      0.39254      0.45648
ans(:,:,2) =
      0.44188      0.56504      0.36534
>> nanmean(B(m+1:end,:,:),1)
ans(:,:,1) =
      0.47919      0.64161          NaN
ans(:,:,2) =
      0.65885      0.74689          NaN

6]将这些平均值连接并重新整形为2D数组 -

C =
      0.54856      0.44188
      0.47919      0.65885
      0.39254      0.56504
      0.64161      0.74689
      0.45648      0.36534
          NaN          NaN

7]忽略NaN行以进行最终输出 -

out =
      0.54856      0.44188
      0.47919      0.65885
      0.39254      0.56504
      0.64161      0.74689
      0.45648      0.36534