我有大量的条目排列在三列。数据样本是:
A=[1 3 2 3 5 4 1 5 ;
22 25 27 20 22 21 23 27;
17 15 15 17 12 19 11 18]'
我希望第一列(小时)控制整个矩阵以创建新矩阵,如下所示:
Anew=[1 2 3 4 5 ; 22.5 27 22.5 21 24.5; 14 15 16 19 15]'
Anew
的第2列是每个相应小时的平均值,例如:
A
的: 在第1小时,我们在第2列中有2个值对应于小时1 这是22和23所以平均值是22.5
同样是第3栏:在第1小时我们有17和11以及 平均值是14,这持续到小时5我正在使用Matlab
答案 0 :(得分:4)
您可以使用ACCUMARRAY:
Anew = [unique(A(:,1)),...
cell2mat(accumarray(A(:,1),1:size(A,1),[],@(x){mean(A(x,2:3),2)}))]
这使用第一列A(:,1)
作为索引(x
)来选择第2列和第3列中的值进行平均(mean(A(x,2:3),1)
)。大括号和对cell2mat
的调用允许您同时处理两个列。否则,您可以单独执行每个列,如此
Anew = [unique(A(:,1)), ...
accumarray(A(:,1),A(:,2),[],@mean), ...
accumarray(A(:,1),A(:,3),[],@mean)]
实际上可能更具可读性。
修改强>
以上假设任何时间都没有丢失条目。否则会导致错误。因此,计算Anew
的更健壮的方法是允许缺失值。为了便于识别缺失值,我们使用fillval
输入参数accumarray
并将其设置为NaN
。
Anew = [(1:max(A(:,1)))', ...
accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
accumarray(A(:,1),A(:,3),[],@mean,NaN)]
答案 1 :(得分:2)
您可以使用consolidator为您完成工作。
[Afinal(:,1),Afinal(:,2:3)] = consolidator(A(:,1),A(:,2:3),@mean);
Afinal
Afinal =
1 22.5 14
2 27 15
3 22.5 16
4 21 19
5 24.5 15