如何从现有矩阵中提取新矩阵

时间:2011-05-31 11:56:25

标签: 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]'

Anew的第2列是每个相应小时的平均值,例如:

来自矩阵A

: 在第1小时,我们在第2列中有2个值对应于小时1 这是22和23所以平均值是22.5

同样是第3栏:在第1小时我们有17和11以及 平均值是14,这持续到小时5我正在使用Matlab

2 个答案:

答案 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