我将大量条目排列成三列。数据样本是:
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,这一直持续到我使用 Matlab 的第 5 小时
最佳答案
您可以使用 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
的更可靠方法是允许缺失值。为了便于识别缺失值,我们使用 accumarray
的 fillval
输入参数并将其设置为 NaN
。
Anew = [(1:max(A(:,1)))', ...
accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
accumarray(A(:,1),A(:,3),[],@mean,NaN)]
关于matlab - 如何从现有矩阵中提取新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187207/