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

3

我是一名有帮助的助手,可以为您进行文本翻译。

以下是需要翻译的内容:

我有大量数据,分成三列排列。其中一部分数据如下:

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的第二列是每个对应小时的平均值,例如:

从矩阵A中: 在第1小时,第2列有2个值相应于第1小时, 它们是22和23,因此平均值为22.5。

同样,第3列:在第1小时,我们有17和11, 平均值为14,这一直延续到第5小时。我正在使用Matlab。

2个回答

4
您可以使用ACCUMARRAY来实现此功能:
Anew = [unique(A(:,1)),...
        cell2mat(accumarray(A(:,1),1:size(A,1),[],@(x){mean(A(x,2:3),2)}))]

这里使用第一列 A(:,1) 作为索引 (x),以选择第二列和第三列的数值进行平均 (mean(A(x,2:3),1))。花括号和调用 cell2mat 允许您同时处理两列。否则,您可以分别处理每一列,像这样

Anew = [unique(A(:,1)), ...
        accumarray(A(:,1),A(:,2),[],@mean), ...
        accumarray(A(:,1),A(:,3),[],@mean)]

这可能会更易读一些。

编辑

上述假设每个小时都没有缺失条目。否则将导致错误。因此,计算Anew的更健壮的方法是允许缺失值。为了方便识别缺失值,我们使用accumarrayfillval输入参数并将其设置为NaN

Anew = [(1:max(A(:,1)))', ...
        accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
        accumarray(A(:,1),A(:,3),[],@mean,NaN)]

谢谢。它完美地适用于我的6000乘以4矩阵。只是我将样例中的数字更改为我的真实矩阵。感谢Jonas。 - user488182

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接