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矩阵非常有效。只是我把示例的数字改成了实矩阵。谢谢你,乔纳斯