Matlab 如何从已有矩阵中提取新矩阵
我有大量的条目分为三列。数据样本如下:Matlab 如何从已有矩阵中提取新矩阵,matlab,matrix,Matlab,Matrix,我有大量的条目分为三列。数据样本如下: 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]' 其中,的第二列是每个相应小时的平均值,例如: 从矩阵A: 在第1小时,第2列中有2个值对应于第1小时 分别是22和23,所以
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]'
其中,的第二列是每个相应小时的平均值,例如:
从矩阵A
:
在第1小时,第2列中有2个值对应于第1小时
分别是22和23,所以平均值是22.5
还有第三栏:在第1小时,我们有17和11以及
平均值为14,这一直持续到我使用Matlab的第5小时,您可以使用:
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)]
这实际上可能更具可读性
编辑
以上假设任何时间都没有遗漏条目。否则将导致错误。因此,重新计算的一种更稳健的方法是允许缺失值。为了便于识别缺少的值,我们使用fillval
输入参数将其设置为acumarray
,并将其设置为NaN
Anew = [(1:max(A(:,1)))', ...
accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
accumarray(A(:,1),A(:,3),[],@mean,NaN)]
你可以用它来为你做这项工作
[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
谢谢这对我的6000乘4矩阵非常有效。只是我把示例的数字改成了实矩阵。谢谢你,乔纳斯