这是解决问题的一种方法,使用 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 中的每一列都被制成一个二维数组,这样我们每列将有N 个元素,因为这里的目的是在将每列进一步切片为前三行的两个子组之后沿每列获取平均值,并且从这样的 3D 数组中剩下四行。因此,Apad 有 2 行,我们将有一个具有两个 3D 切片的 3D 数组,这样第一个 3D 切片将是Apad 中第一列的重新整形版本,即Apad(:,1)。同样,第二个 3D 切片对应于Apad 中的第二列。因此,结果 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] 将这些平均值连接并重新整形为二维数组 -
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