Matlab将行的第一列作为索引进行匹配,然后对该行中的所有列进行平均

时间:2013-10-14 15:33:26

标签: matlab matrix average matching mean

我需要帮助获取以下数据,这些数据以大矩阵形式组织,并对具有匹配ID(索引)的所有值进行平均,并输出另一个矩阵,其中仅包含ID和跟踪它的平均值。

File with data format:
(This is the StarData variable)
ID>>>>Values

002141865 3.867144e-03  742.000000  0.001121  16.155089  6.297494  0.001677

002141865 5.429278e-03  1940.000000  0.000477  16.583748  11.945627  0.001622

002141865 4.360715e-03  1897.000000  0.000667  16.863406  13.438383  0.001460

002141865 3.972467e-03  2127.000000  0.000459  16.103060  21.966853  0.001196

002141865 8.542932e-03  2094.000000  0.000421  17.452007  18.067214  0.002490

不要被我发布的例子误导,第一个数字重复大约15行,然后ID改变,这是一整套不同的ID,然后它们再次作为整个组重复,想想第一个块代码= [1 2 3; 1 5 9; 2 5 7; 2 4 6]然后代码重复使用除索引之外的列的不同值。主要的区别是跟踪ID的值,我需要在matlab中对其进行平均,并输出一个干净的矩阵,每个ID中只有一个完全取平均值。 感谢您给予的任何帮助。

1 个答案:

答案 0 :(得分:1)

this answer的修改完成了以下工作:

[value_sort ind_sort] = sort(StarData(:,1));
[~, ii, jj] = unique(value_sort);
n = diff([0; ii]);
averages = NaN(length(n),size(StarData,2)); % preallocate
averages(:,1) = StarData(ii,1);
for col = 2:size(StarData,2)
  averages(:,col) = accumarray(jj,StarData(ind_sort,col))./n;
end

结果是变量averages。它的第一列包含用作索引的值,每个后续列包含根据索引值的该列的平均值。

Matlab 2013a以后的兼容性问题

函数unique在Matlab 2013a中有changed。对于该版本,请将'legacy'标记添加到unique,即将第二行替换为

[~, ii, jj] = unique(value_sort,'legacy')