我有一个13867 X 2元素的数组,存储在名为“data”的变量中。所以,我想在Matlab中做以下几点:
答案 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